私は本質的に次のようなクラスを持っています:
class Child extends Parent {
public void reinitialize() {
super(); // illegal
}
}
基本的に、コンストラクターを再度呼び出して再初期化します。Parent
ソースを変更できないライブラリクラスであるため、初期化コードを独自のメソッドにリファクタリングすることはできません。
これを行う方法はありますか?
私は本質的に次のようなクラスを持っています:
class Child extends Parent {
public void reinitialize() {
super(); // illegal
}
}
基本的に、コンストラクターを再度呼び出して再初期化します。Parent
ソースを変更できないライブラリクラスであるため、初期化コードを独自のメソッドにリファクタリングすることはできません。
これを行う方法はありますか?
いいえ、これを行う方法はありません。JVM バイトコード レベルでも、一連の<init>
メソッド (コンストラクター) は、特定のオブジェクトに対して最大 1 回しか呼び出すことができません。
通常の答えは、コードを通常のインスタンス メソッドにリファクタリングすることですが、おっしゃる通り、これは不可能です。
あなたができる最善の方法は、再初期化の必要性を回避するために再設計する方法を見つけることです。または、必要な親コンストラクターに特定の動作がある場合は、それを自分で複製できる場合があります。
これに対する唯一の回避策は、次のいずれかです。
これを行う 1 つの方法は、新しい Child オブジェクトを返す静的メソッドを提供することです。または、クライアント コードで新しい Child オブジェクトを単純に作成することもできます。いずれにせよ、既存のオブジェクトを再利用することはできないようです。
これを達成する方法はいくつかあります。それらの1つは、「init」などの別のメソッドを作成することです。この「init」メソッドは、コンストラクターまたはreinitializeメソッドのいずれかから呼び出す必要があります。