2

(ジャバの質問)

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

どうすればこれを回避できますか?

以下に例を示します。

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
4

3 に答える 3

10

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

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

円を閉じる:とにかく、Java での循環参照には何の問題もありません。オブジェクトは適切に機能し、参照されなくなるとガベージ コレクションが行われます。彼らがお互いを指していても構いません。

于 2008-09-23T01:42:01.753 に答える
0

(これがあなたが求めているものであるかどうかはわかりません...)

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

于 2008-09-23T00:49:15.263 に答える
0

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

ここで何をしているのかわかりませんが、保守性などのために、よりシンプルな設計を検討することをお勧めします.

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

于 2008-09-22T23:58:49.050 に答える