コンストラクタ内で作成されたオブジェクトへの参照を維持するよい方法は、拡張クラスのスーパーコンストラクタに渡す必要があるクラスとして渡すか、コンストラクタにパラメータとして渡します)?スーパーコンストラクタに渡される新しいオブジェクトへの参照を保持する
例を用いて明確にしてください。 (私は変更することはできませんし、これは私にfooへのアクセス権を与えるものではありません)このクラスを取る:
今class TestA {
TestA(Object foo) {}
}
、私は次のようにこのクラスを拡張したいと思います:
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
があります作成したnew Object()
を保存する良い方法はmyCopyOfFoo
ですか?
どちらもこれら三つのアイデアの一つは仕事:
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
(エラー:コンストラクタの呼び出しは、コンストラクタの最初のステートメントでなければなりません)
TestB() {
super(myCopyOfFoo = new Object());
}
(エラー:インスタンスフィールドのmyCopyOfFooを参照することはできませんコンストラクタを明示的に呼び出す)
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
(エラー:iを参照できません明示的にコンストラクターを起動している間nstance法)
私は、次の操作を行うことができると思いますが、それは、スレッドセーフでもエレガントでもないです:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
誰も私のためのより良いアイデアを持っていますか?なぜ私の最初の2つのアイデアは合法ではないのですか?
についてどのように
これは、私はすでにとにかく多くの場合、第2のプライベートコンストラクタを使用していますので、実際には、うまく自分のコードに合った良い解決策のように見えます。私はすでにこの回答にチェックマークを付けるように誘惑されていますが、まだ多くのコードのようです。私はそれを疑うが、もっと短い提案があるかどうかを見てみよう。しかし、すでにありがとう! –
@Markus:あなたの*実際のケースが実際にすでにパラメータを受け取り、コピーを作成しているなら、私は潜在的な提案があります。あなたが指定したコードが本当に代表的なものであれば(つまり、新しいオブジェクトを何も作成していない)、私の他の提案は役に立たないでしょう。私はそれを編集します。 –