19

Let's assume I have classes A, B, and C where class C has readable and writable properties:

public class C {
    private int i = 0;

    // Writable.
    public void increment() { i++; }

    // Readable.
    public int getScore() { return i; }
}

Is it possible to only let A use the increment() method and only let B use the getScore() method?

4

6 に答える 6

29

いいえ、クラスごとにアクセス権を割り当てることはできません。

各クラスが必要なインターフェイスを持つオブジェクトのみを取得するように、クラスを個別のインターフェイスに分割することを検討してください。例えば:

interface Incrementable { public void increment(); }
interface HasScore { public int getScore(); }
class C implements Incrementable, HasScore { /* ... */ }

class A {
  public A(Incrementable incr) { /* ... */ }
}

class B {
  public B(HasScore hs) { /* ... */ }
}

もちろん、セキュリティへの影響はありますが、これにより、正しい方向に考えることができるはずです。

于 2013-02-05T22:33:21.807 に答える
6

はい、そうですが、いくつかの回転を経験する必要があります。

public interface Incrementable {
    public void increment();
}

public interface Readable {
    public int getScore();
}

public class C implements Incrementable, Readable
{
    ...
}

Bここで、インスタンスへの参照を受け取るメソッドを A で定義するときに、そのメソッドを定義して、Incrementable代わりに an を受け取ります。の場合B、 を取るように定義しますReadable

于 2013-02-05T22:34:40.553 に答える
3

Java には、プライベート、プロテクト、パブリック、および「パッケージ」の 4 つのスコープがあります。公開されているものは、どこからでもアクセスできます。サブクラスからのみ保護されます。private はそのクラスのみです。「パッケージ」スコープは名前が付けられていませんが、他の 3 つのいずれかを省略した場合は、パッケージ スコープと見なされます。これは、同じパッケージ内の他のクラスからのみアクセスできます。

HTH。

于 2013-02-05T22:33:17.250 に答える
2

やりたいことではありませんが、スタック トレースを調べて (例外を作成し)、インクリメント メソッドを呼び出しているクラスを確認することができます。

于 2013-02-06T00:11:25.913 に答える
2

いいえ、それはできません。

于 2013-02-05T22:32:25.657 に答える
1

率直な答えは「いいえ」ですが、別の回避策 (見苦しいもの) は、3 つ目のインターフェイスを拡張する 2 つのインターフェイスを作成することです (または、オブジェクトをパラメーターとして使用することもできます): Reader と Writer で、呼び出し元のクラスをパラメーターとして各関数に渡します。 :

public interface Caller;
public interface Reader extends Caller;
public interface Writer extends Caller;


public void increment(Caller c) { 
     if (c instanceof Writer) {
         i++;
     } 
}
于 2013-02-05T22:38:31.060 に答える