10

次に例を示します。

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

class List
{
   ...
   public void insert ()
   {
      /*insertion occurs*/
   }
   ...
}

insert() メソッドを公開したままにして、A から呼び出された場合にのみ他のクラスがアクセスできないように、クラス A のみにアクセスを制限することはまったく可能ですか?

4

8 に答える 8

7

メソッドを呼び出しているオブジェクトを引数として渡します。つまり、

list.insert("x", this);

次に、渡されたオブジェクトがクラス A のインスタンスであるかどうかを確認します

 public void insert (String x, Object o)
   {
      if(o instanceof ClassA){
         /*insertion occurs*/
      }
   }
于 2012-10-15T12:20:35.547 に答える
6

メソッドが公開されている場合、誰もがアクセスできます。あなたのようなコントロールにアクセスする秘訣は、インターフェイスを介して一連のパブリック操作を公開し、インターフェイスを実装するプライベート クラスに補助操作を追加し、クラスではなくインターフェイスに対してユーザー プログラムを作成することです。

次に例を示します。

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); }
}

使用シナリオ:

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));
于 2012-07-18T20:11:02.510 に答える
2

はい、呼び出しオブジェクトを引数として渡し、実際のコードの前に insert() メソッドにチェックを入れることができます。

  public void insert(Object obj){
    if(obj instanceof A){
      //your code block
    }
  }

これにより、A を拡張するすべてのクラスも insert を呼び出すことができることに注意してください。クラス A だけに制限したい場合は、さらにチェックを追加します。

  public void insert(Object obj){
    if((obj instanceof A) && obj.getClass().getSimpleName().equals("A")){
      //your code block
    }
  }

条件 "obj.getClass().getSimpleName().equals("A")" のみで 2 番目のケースを実現することもできます。

于 2018-06-02T07:53:51.597 に答える
1

前の回答のすべての「内部クラス」が混乱している場合は、より直感的な別の方法があります(extendsキーワードと継承について学習したと仮定します)。の代わりにinsert()メソッドを作成し、 extendを作成するだけです。例えば:protectedpublicclass AList

public class List {
   ...
   protected void insert() {
      //insertion occurs
   }
   ...
}

public class A extends List {
   ...
}

他のクラスがListを拡張しない限り、タイプのオブジェクトのみAがメソッドListを使用できますinsert()

于 2012-07-18T20:31:00.327 に答える
1
package problems;

public class Problem1 {
    public static void main(String[] args) {
        B b = new B();
        b.methodInB();
        C c = new C();
        c.methodNotInB();
    }
}

class A {
    public void onlyB() {
        StackTraceElement[] stackTraceElements = Thread.currentThread()
                .getStackTrace();
        if (!problems.B.class.getCanonicalName().equals(
                stackTraceElements[stackTraceElements.length - 2]
                        .getClassName())) {
            System.err.println("You are not authorized to call me!!");
            return;
        }
        System.out.println("You are authorized to call me!!");
    }
}

class B {
    public void methodInB() {
        A a = new A();
        a.onlyB();
    }
}

class C {
    public void methodNotInB() {
        A a = new A();
        a.onlyB();
    }
}
于 2012-09-19T19:01:55.397 に答える
1

アクセス修飾子を使用してできる最善の方法は、メソッド パッケージを非公開にして (publicキーワードを削除して)、これら 2 つのクラスのみを同じパッケージに保持することです。

于 2012-07-18T20:10:24.783 に答える
0

許可されたクラスに入れて、プライベートにします。

于 2012-07-18T22:52:37.363 に答える
0

Aの内部クラスとして配置するか、別のことを行うことができます...挿入にオブジェクト型のパラメーターを1つ取り、最初にパラメーターの型がAであるかどうかを確認します....呼び出し時に呼び出しを送信しますオブジェクト...おそらくそれは良い考えではありませんが、それはあなたが望むことをします

于 2012-07-18T20:17:26.277 に答える