コンストラクターで作成されたオブジェクトへの参照を維持するための良い方法はありますか?それは、拡張クラスのスーパーコンストラクターに渡す必要があります(スーパークラスからアクセスできるようにするか、パラメーターとしてコンストラクターに渡す以外)?
例を挙げて明確にしましょう。このクラスを取得します(これは変更できず、fooへのアクセスも許可されません):
class TestA {
TestA(Object foo) {}
}
ここで、このクラスを次のように拡張したいと思います。
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
new Object()
で作成したものを保存する良い方法はありmyCopyOfFoo
ますか?
これらの3つのアイデアのいずれも機能しません。
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
(エラー:コンストラクター呼び出しはコンストラクターの最初のステートメントである必要があります)
TestB() {
super(myCopyOfFoo = new Object());
}
(エラー:コンストラクターを明示的に呼び出している間は、インスタンスフィールドmyCopyOfFooを参照できません)
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
(エラー:コンストラクターを明示的に呼び出している間はインスタンスメソッドを参照できません)
私は次のことができると思いますが、それはスレッドセーフでもエレガントでもありません:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
誰かが私のためにもっと良いアイデアを持っていますか?そして、なぜ私の最初の2つのアイデアが合法ではないのですか?