Java:如何限制方法对特定类的访问?

IDD*_*DQD 8 java class

这是一个例子:

class A 
{
   List l = new List ();
   list.insert("x");
}

class List
{
   ...
   public void insert ()
   {
      /*insertion occurs*/
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

是否有可能将insert()方法保持为public,但是只限制对A类的访问,以便只有从A调用时才能访问其他类?

das*_*ght 5

如果该方法是公开的,则每个人都可以访问它.像你这样访问控制的技巧是通过接口公开一组公共操作,将辅助操作添加到实现接口的私有类,并使用户编程到接口,而不是类.

这是一个例子:

public interface MyList {
    Object elementAt(int i);
}
public class A {
    private static class MyListImpl implements MyList {
        public Object elementAt(int i) {
            ...
        }
        public void insert(Object element) {
            ...
        }
    }
    private final MyListImpl list = new MyListImpl();
    public MyList getList() { return list; }
    public void insert(Object o) { list.insert(o); }
}
Run Code Online (Sandbox Code Playgroud)

使用场景:

A a = new A();
a.insert(123);
a.insert("quick brown fox");
MyList lst = a.getList();
System.out.println(lst.elementAt(0));
System.out.println(lst.elementAt(1));
Run Code Online (Sandbox Code Playgroud)


1r0*_*n1k 5

我可以将调用方法的对象作为参数传递,即

list.insert("x", this);
Run Code Online (Sandbox Code Playgroud)

然后检查传递的对象是否是A类的实例

 public void insert (String x, Object o)
   {
      if(o instanceof ClassA){
         /*insertion occurs*/
      }
   }
Run Code Online (Sandbox Code Playgroud)

  • 这没有限制,每个人都可以将Object(或任何类)的实例传递给方法... (4认同)

hvg*_*des 1

使用访问修饰符可以做的最好的事情就是使方法包私有(删除关键字public)并仅将这两个类保留在同一个包中。