1

私はprivate内部クラスの変数に直接アクセスできるので...クラスにアクセスする唯一の方法innerはクラスを介することouterです..内部クラスのパブリックアクセサー/ミューテーターメソッドを持つことに価値はありますか?

public class Outer {
    Inner   i;

    Outer() {
        i.v = 5;
    }

    private class Inner {
        private int v;
    }  
}

この質問の目的のために、アクセス時に遅延インスタンス化やその他のデータ操作は必要ないと仮定します。

4

2 に答える 2

5

フィールドを非プライベートにすると、これらのプライベート メンバーにアクセスするための合成メソッドが作成されるのを回避できます。あなたの例では、コンパイルされOuter$Innerたクラスには次のような合成メソッドが含まれています。

static int access$002(Outer$Inner, int);
   Code:
      0: aload_0
      1: iload_1
      2: dup_x1
      3: putfield      #1                  // Field v:I
      6: ireturn

たぶんそれは何もインライン化されないかもしれませんが、そうではないかもしれません...しかし、その存在を強制する理由vがない限り、デフォルトのアクセス権を与えないのはなぜですか?

フィールドを直接使用するのではなく、アクセサメソッドを使用することに関しては...それは好みの問題です。外部クラスがフィールドに直接アクセスすることを防ぐことはできないため、クラス内のプライベート フィールドのアクセサーを作成する必要があるかどうかを尋ねるのと少し似ています。

別の回答で述べたように、アクセサーを使用すると、リファクタリングしやすくなります。ネストされたクラスは、移動する必要のない単なる実装の詳細ですか? なら、いいかも。他の動作を持たないフィールドをカプセル化するだけのそのようなクラスがある場合、フィールドを公開して (プライベート クラス内で、忘れないでください) 「ねえ、ここでは何もチェックしていません」と宣伝することがわかりました。 ...」

于 2012-04-12T19:45:43.460 に答える
1

後で、関数呼び出しまたはその他の方法で Inner オブジェクトを公開する可能性がある場合、はい、それは重要です。内部クラスで何が起こっているかによっては、同期の目的でも重要になる場合があります

于 2012-04-12T19:45:32.093 に答える