2013-07-17 20 views
15

私は別のstatic内部クラスを持つクラスを持っている:あなたはインスタンス変数にアクセスする必要はありませんとき静的な内部クラスから外部クラスのフィールドにアクセスできますか?

class A { 
    private List<String> list; 

    public static class B { 
     // I want to update list here without making list as static 
     // I don't have an object for outer class 
    } 
} 
+3

静的ネストされたクラスは、周囲のクラスのすべてのインスタンスへの暗黙的な参照を持っていません。変更するインスタンスへの参照を渡す必要があります。クラスBはなぜ静的なのですか? –

+0

クラスBは、UI表示のためのテンプレート構造を生成していましたが、値を取得するために何らかの操作を実行しています。そのクラスを周囲のクラスに設定する必要があります。これは設計上の問題ですか? –

+0

各Bインスタンスが特定のAインスタンスに関連し、それを操作できるようにする必要がある場合、最も単純な解決策はBを非静的にし、構築時にその関係を確立することです。 –

答えて

6

あなたはそれを行うために、非静的な内部クラスが必要になります他の回答から見ることができるように。

あなたが本当にあなたの内部クラスは、非静的その後は外部クラスに必要なgetterメソッドとsetterメソッドを追加し、内部の静的クラスの内側から外側のクラスのインスタンスを作成することにより、それらにアクセスすることができ作ることができない場合は、次の

public class A { 
    private List<String> list = new ArrayList<String>(); 
    public List<String> getList() { 
     return list; 
    } 
    public void setList(List<String> list) { 
     this.list = list; 
    } 
    public static class B { 
     // i want to update list here without making list as static 
     void updList() { 
      A a = new A(); 
      a.setList(someOtherList); 
      System.out.println(a.getList()); 
     } 
    } 
} 
+1

これは本当にクラスAのオブジェクトを 'A a = new A();'という式で考えると、ローカルで、初期値は?あなたは精巧にできますか? – misty

+0

あなたは内部クラスで何をしようとしていますか? – anubhava

8

あなたは、一般的に、静的クラスを使用します。インスタンス変数にアクセスする必要がある場合は、クラスを非静的にします。

2

いいえ、それを行うには、static以外のクラスが必要です。 JLS §8.5.1から

staticキーワードは、非内部クラスまたはインタフェースTの体内のメンバー型Cの宣言を変更することができます。その効果は、Cが内部クラスではないことを宣言することです。 Tの静的メソッドが本体にTの現行インスタンスを持たないのと同様に、Cも現在のインスタンスはTでなく、語彙的に囲むインスタンスもありません。

staticクラスに、囲むクラスの非静的メンバーの使用が含まれていると、コンパイル時エラーです。あなたのコードで

0

listはクラスAのインスタンス変数であるとBは、ネストされた静的なクラスです。静的メンバーではなく静的メンバーにアクセスするルールは、ネストされた静的クラスでは変更されません。

  • 変数listはインスタンス変数であるため、静的コンテキストからはアクセスできません。
  • これを有効にするには、静的ネスタークラスをインナークラスに変更する必要があります。

    class A { 
    private List<String> list = new ArrayList<String>(); 
        public class B { 
        public void someMethod(){ 
         list.add("abc"); 
        } 
        } 
    } 
    
0

内部クラスが意味する静的であるprivate List<String> list;

ここリストは、インスタンス変数であるクラスBは異なって同じであるクラスAインスタンス; 1つはそれにアクセスできません。そして、それも非常に良好で明白な理由からです。使用できる

一つの解決策は、メモリリークを回避するために、弱い参照クラスBのコンストラクタメンバリストの合格基準です。このような

何か:

class A { 
    private List<String> list; 

    public static class B { 
     WeakReference<List<String>> innerList; 
     //constructor 
     B(WeakReference<List<String>> innerList){ 
      this.innerList = innerList; 
     } 
    } 
関連する問題