質問

(Javaの質問)

内部クラスのフィールドを参照すると、外側のクラスと内部クラスの間で循環依存関係が発生しますか?

これを回避するにはどうすればよいでしょうか?

以下に例を示します。

public class Outer {

  private Other o;
  private Inner i;    

  public Outer() {
    o = new Other();

    i = new Inner() {
      public void doSomething() {
        o.foo();
      }
    };

  }
}
役に立ちましたか?

解決

静的クラスとインスタンス クラス: 内部クラスを静的として宣言すると、内部クラスのインスタンスは外部クラスへの参照を持ちません。それがサティックでない場合、内部オブジェクトはそれを作成した外部オブジェクトを事実上指します (暗黙の参照があります。実際、そのコンストラクターに対してリフレクションを使用すると、外部インスタンスを受け取るための追加のパラメーターが表示されます)。

内部インスタンスは外部インスタンスを指します。 循環参照は、各インスタンスが他のインスタンスを指す場合に使用されます。多くの場合、外部クラスとのインターフェースを実装せずに、いくつかのインターフェースをエレガントに実装し、プライベート フィールドにアクセスするために内部クラスを使用します。これは、内部インスタンスが外部インスタンスを指すことを意味しますが、その逆の意味ではありません。循環参照は必要ありません。

サークルを閉じる: とにかく、Java の循環参照には何の問題もありません。オブジェクトは適切に動作し、参照されなくなるとガベージ コレクションされます。彼らがお互いを指しているかどうかは関係ありません。

他のヒント

この例で使用している構文は少し異なり、クラスまたはインターフェイス Inner の宣言がありません。しかし、この例の概念には何も問題はありません。Javaでは問題なく動作します。

ここで何をしているのかわかりませんが、保守性などを考慮して、よりシンプルな設計を検討した方がよいかもしれません。

匿名イベント ハンドラーが親クラスの要素を参照するのは一般的なパターンなので、その場合はそれを避ける理由はありません。Java は関数ポインターを持たずにそのように設計されています。

(これがあなたの質問なのかどうかわかりませんが...)

実行時、内部クラスは、それが属する外部クラスのインスタンスへの暗黙的な参照を持ちます。したがって、内部クラスのインスタンスを渡すたびに、外部クラスのインスタンスも渡すことになります。
内部クラスを「static」として宣言することでこれを回避できますが、これは内部クラスが外部クラスのメンバー変数にアクセスできないことを意味します。したがって、その場合、外部クラスのメンバーにアクセスしたい場合は、(セッターを使用するか、内部クラスのコンストラクターを使用して) それを内部クラスに明示的に渡す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top