これが私の問題です
class A{
private B b = new B(this); // line 2
A(){}
}
これは単なる例です。コードと正常に動作します。this
しかし、私は現在の参照(Aのインスタンス)に使用されていることに疑問を持っています。クラスの初期化は、クラスインスタンスを取得する前に行われます。this
では、どうすれば2行目に入れることができますか?初期化する前にインスタンス化は発生しますか?
これが私の問題です
class A{
private B b = new B(this); // line 2
A(){}
}
これは単なる例です。コードと正常に動作します。this
しかし、私は現在の参照(Aのインスタンス)に使用されていることに疑問を持っています。クラスの初期化は、クラスインスタンスを取得する前に行われます。this
では、どうすれば2行目に入れることができますか?初期化する前にインスタンス化は発生しますか?
あなたは興味深い点を持ち出します。これは、例を使用するときに発生する可能性のある実行時の問題を示す、考案された教育例です。
class A {
private boolean isInitialized = false;
private final B b = new B(this);
public A() {
initialize();
}
private void initialize() {
isInitialized = true;
}
public boolean isInitialize() {
return isInitialized;
}
public B getB() {
return b;
}
}
class B {
private boolean isInitialized = false;
final private A a;
public B(final A a) {
this.a = a;
initialize();
System.out.println("inB: a.isInitialize()=" + a.isInitialize());
}
private void initialize() {
isInitialized = true;
}
public boolean isInitialize() {
return isInitialized;
}
}
public static void main(final String[] args) {
final A a = new A();
System.out.println("inMain: a.isInitialize()=" + a.isInitialize());
System.out.println("inMain:a.getB().isInitialize()=" + a.getB().isInitialize());
}
出力:
inB: a.isInitialize()=false
inMain: a.isInitialize()=true
inMain:a.getB().isInitialize()=true
クラスB内のクラスAに渡された参照を使用すると、完全に初期化されていないオブジェクトを使用するという実際のリスクが発生します。
気をつけて。
new ClassA()
これはクラスの初期化ではなく(段階的にデバッグしてみてください)、実際にはインスタンスの初期化です。
コンストラクター(from )が、初期化されていないフィールドにアクセスするClassB
関数fromを呼び出す場合、いくつかの問題が発生する可能性があります。ClassA
ClassA
編集:これは、コンストラクターが呼び出される前に行われます。
this
クラスAのオブジェクトを作成すると、その存在が表示されます。インスタンス変数はオブジェクトの作成後に割り当てられ、静的変数はクラスが読み込まれるとすぐに、またオブジェクトの作成前に初期化されます。静的ブロックで上記の初期化を使用することはできません
static {
private B b = new B(this); // compiler error. you cannot use 'this' in static context.
}
this
正しく使用されています。コンストラクターを呼び出す必要はまったくありません。
変更の必要はありません、すべてが大丈夫です。this
Aへの有効な参照です。