Estorsky:
例えば、私が持っています:
public abstract class SomeAbstract {
private int a;
private int b;
..
private int z;
}
public class A extends SomeAbstract {
private String aField;
}
public class B extends SomeAbstract {
private long bField;
}
(デフォルトコンストラクタ/セッター/ゲッターは省略されています)
私は、クラスAのいくつかのインスタンスを持っていると私はA(抽象フィールド)からクラスBのインスタンスを作成したいです。
はい、私は抽象クラスのコンストラクタを使用するか、このようなクラスBのコンストラクタを作成することができます。
public B(A a) {
this.a = a.getA();
this.b = a.getB();
..
this.z = a.getZ();
}
しかし、私は多くの分野を持っているので、これは見栄えしない、便利な別の方法はありますか?
Luiggiメンドーサ:
あなたは、別のスーパークラスを受けて、スーパークラスのコンストラクタを作成することができます。
public abstract class SomeAbstract {
/* attributes... */
public SomeAbstract() {
}
protected SomeAbstract(SomeAbstract another) {
this.a = another.a;
/* and on... */
}
}
そして、サブクラスでこのコンストラクタを再利用:
public class B extends SomeAbstract {
public B(A a) {
super(a);
this.specificAttribute = a.somethingElse;
}
}
あなたはその多くのフィールドを持っており、手動で全体のコードを作成する/必要性をしたくない場合は、クラス間のマッピングに役立ちます外部ライブラリを使用することができます。いくつかのオプションがあります:
- ドーザーオブジェクト間のデータをマップします。コンフィギュレーションは、XMLや注釈を介して行うことができます。それはあなたのアプリケーションのパフォーマンスに直接影響を与える可能性がありますので、リフレクションを使用して、このライブラリー作品(私の知る限り)。
- オリカオブジェクト間のデータをマッピングするために、実行時にバイトコードを生成します。コンフィギュレーションは、設計時に行われます。それはあなたのアプリケーションのパフォーマンスに直接影響を与える可能性がありますので、リフレクションを使用して、このライブラリー作品(私の知る限りでは)、私はそれをテストした際に、実行時間が速くドーザーより(7倍程度高速化)でした。
- MapStructクラス(、ゲッターとセッターを使用してヌルを検証して上を)マッピングするためのコードを生成し、このコードは、実行時に利用できるようになります。設定は、アノテーションを通じて、設計時に行われます。このライブラリ作品(私の知る限り)それは、コードの正常な実行に似ていますので、Javaコードを使用して(例えば、実行
b.setValue(a.getValue()))
。