0

シナリオ: サブクラスの階層があり、そのすべてが単一距離先祖クラスから継承されています。階層内のすべてのスーパー クラスは抽象クラスであるため、具象クラスはサブクラスを持たないクラスのみです。私は配列を持っています:

AncestralClass[] someObjects1 = new AncestralClass[someLength];

ancestralClass は、他のすべてのクラスが継承する階層の最上位にある単一のスーパー クラスです。この配列には、さまざまな具象サブクラスのさまざまなオブジェクトが取り込まれます。例えば:

someObjects1[4] = new SubclassObject();

... 等々。

まったく同じ形式 (同じ型、サイズなど) の 2 番目の配列がありますが、2 番目の配列は最初の配列を使用して、さまざまな具象サブクラスに属するオブジェクトを再度入力します。より具体的には、2 番目の配列の要素のオブジェクト タイプは、最初の配列の同じ要素で見つかったオブジェクト タイプに基づいて決定されます。したがって、私が抱えている問題は次のとおりです。最初の配列の内容は実行時にランダムに生成されるため、最初の配列に何が含まれているかわかりません。したがって、最初の配列に依存しているため、2番目の配列の内容がどうあるべきかわかりません配列。2 番目の配列で新しいオブジェクトをインスタンス化するコードの書き方がわかりません。英語で書かれていると、私が実現したいことはとてもシンプルで簡単に聞こえます。2番目の配列をループしたいのですが、最初の配列で対応する位置を確認し、それがどのような種類のオブジェクトであるかを確認してから、2 番目の配列でその型の新しいオブジェクトをインスタンス化します。その通り、コーディング方法がわからないことがあります。

someObjects2[i] = new (subclass that someObjects1[i] belongs to)(); 

質問 より一般的に言えば、既存のオブジェクトが属するクラスの新しいインスタンスである新しいオブジェクトをインスタンス化したいと考えています。これを行うにはどうすればよいですか。複数のソリューションがあると確信しているので、どれが優れていますか?

4

2 に答える 2

0

私は、この考えはちょっと疑わしいと思います。事前に制御できない型のクラスを作成しようとすると、あらゆる種類の問題が発生する可能性があります。

したがって、これを行う場合、最初に行うことは、最も基本的な作成パターンである単純なファクトリ メソッドを使用することです。これにより、すべてのコードを 1 か所に分離できるため、後で変更する必要が生じた場合に変更できます。次に、リフレクションを使用してオブジェクトを作成します。

public class Creation
{
   private Creation() {}

   public static <S, T extends S> S makeNew( T obj )
           throws InstantiationException, IllegalAccessException
   {
      return (S) ( obj.getClass().newInstance() );
   }

   // Demonstration
   public static void main( String[] args )
           throws InstantiationException, IllegalAccessException
   {
      CharSequence[] cs = { new StringBuilder(), new Segment()  };
      for( CharSequence c : cs ) System.out.println( makeNew( c ) );
   }
}

これは、単純なケースで機能します。将来Objenesisのような派手なライブラリを使用する必要がある場合は、簡単に変更を加えることができます。

于 2014-11-11T18:31:04.633 に答える