4

私は本質的に次のようなクラスを持っています:

class Child extends Parent {
  public void reinitialize() {
    super();  // illegal
  }
}

基本的に、コンストラクターを再度呼び出して再初期化します。Parentソースを変更できないライブラリクラスであるため、初期化コードを独自のメソッドにリファクタリングすることはできません。

これを行う方法はありますか?

4

4 に答える 4

7

いいえ、これを行う方法はありません。JVM バイトコード レベルでも、一連の<init>メソッド (コンストラクター) は、特定のオブジェクトに対して最大 1 回しか呼び出すことができません。

通常の答えは、コードを通常のインスタンス メソッドにリファクタリングすることですが、おっしゃる通り、これは不可能です。

あなたができる最善の方法は、再初期化の必要性を回避するために再設計する方法を見つけることです。または、必要な親コンストラクターに特定の動作がある場合は、それを自分で複製できる場合があります。

于 2012-12-09T20:08:56.877 に答える
3

これに対する唯一の回避策は、次のいずれかです。

  • 「再初期化」する必要があるたびに新しいオブジェクトを作成します。
  • 両方を使用する必要がある場合でも、継承の代わりに委任を使用してください。委任を使用すると、インスタンスを置き換えることができます。
  • 親コンストラクターとほぼ同じことを行う再初期化メソッドを作成します。たとえば、必要に応じてリフレクションを使用して、フィールドを置き換えたり、コレクションをクリアしたりします。
于 2012-12-09T20:23:49.803 に答える
1

これを行う 1 つの方法は、新しい Child オブジェクトを返す静的メソッドを提供することです。または、クライアント コードで新しい Child オブジェクトを単純に作成することもできます。いずれにせよ、既存のオブジェクトを再利用することはできないようです。

于 2012-12-09T20:08:43.367 に答える
0

これを達成する方法はいくつかあります。それらの1つは、「init」などの別のメソッドを作成することです。この「init」メソッドは、コンストラクターまたはreinitializeメソッドのいずれかから呼び出す必要があります。

于 2012-12-10T12:55:28.680 に答える