7

AとBという名前の2つのクラスがあり、各クラスのオブジェクトに他のクラスへの参照が含まれていると最も便利なように、互いに関連付けられているとします。つまり、クラスAにはクラスBの変数「b」があります。クラスBにはクラスAの変数「a」があります。このようにして、各クラスのコードは他のクラスに簡単にアクセスできます。

この関連付けを「最終」に設定する方法はありますか?つまり、クラスAの変数bが最終であり、クラスBの変数aが最終ですか?コンストラクターでこれらの参照を設定するには(finalキーワードで必要になるように)、非論理的な循環型の参照が必要になるようです。

これは、実際的な問題というよりも概念的な問題です。ありがとう!

4

3 に答える 3

6

別のポスターが指摘したように、クラスの 1 つを別のクラスの構築に責任を持たせ、それ自体を別のオブジェクトのコンストラクターに渡すことで、これを行うことができます。

ただし、これは、最初のクラスの 1 つのインスタンスを 2 番目のクラスの 1 つのインスタンスに対応させたい場合 (そうしているように見えます)、潜在的な問題に役立ちます。別のオブジェクトは、最初のクラスへの既存の参照を 2 番目のクラスのコンストラクターに渡す可能性があるため、無効な状況が発生する可能性があります (2 番目のクラスのインスタンスは、最初のクラスのインスタンスへの参照を持ち、のインスタンスを参照します)。セカンドクラス)。

2 番目のクラスのコンストラクターが最初のクラスの初期化されていないメンバーを参照できないと考えると、さらに潜在的な問題が発生します。

私の提案は、2 つのクラスが非常に相互に関連しているため、それぞれが他方への最終的な参照を持ちたい場合は、それらを同じ class にすることです。次に、常に他のオブジェクトへの最終参照を取得します: this.

于 2009-08-21T04:33:36.183 に答える
6

はい、クラスの1つが他のクラスのインスタンスの作成を担当している場合は可能です。最初のコンストラクターは、それ自体のインスタンスを 2 番目のクラスのパラメーターとして渡すことができます。

public class A {
    final B b;
    public A() {
        b = new B(this);
    }
    public B getB() {
        return b;
    }
}
public class B {
    final A a;
    public B(A a) {
        this.a = a;
    }
}
于 2009-08-21T05:06:57.287 に答える
1

guiceなどのDiコンテナーを使用する場合、コンストラクター内で明確な参照を渡すことなくこれを実現できます。これは、前に指摘したようにエラーが発生しやすい可能性があります。

依存関係abとbaを宣言し、それらの1つを別のクラスに挿入します。guiceは、両方のフィールドをファイナルにするために魔法をかけます。基本的に、最初に1つのプロキシを注入し、後でその委任を設定します。

このためのコードサンプルが必要ですか?

于 2009-08-21T06:24:00.703 に答える