0

重複の可能性:
クローンメソッドを適切にオーバーライドするには?

合計で約 100 ~ 200 個のプリミティブ変数が含まれる単純なクラスがあります。次のように、非常に単純に構成されています。

public class Level implements Clonable {
    int speed; 
    boolean wallKicks;
    boolean bigMode;
    float targetFrequency;
    long milliseconds;
    double fade;
    int[] perfectPenalties;
    <100 or so more things like this>
}

このクラスを複製できる必要があります。今のところ、clone() メソッドで各メンバー変数のコピー アクションを明示的に入力しました。

public Object clone() {
     Level newLevel = new Level();
     newLevel.speed = speed;
     newLevel.wallKicks = wallKicks;
     newLevel.bigMode = bigMode;
     newLevel.perfectPenalties = perfectPenalties.clone();
     <etc>
}

問題は、clone メソッドで値を見逃していないことを確認するのが少し面倒なことです。将来的には、equals() 関数も実装したいと考えています。これは、3 つの場所でデータを手動で同期する必要があることを意味します。楽しくない。

これを達成する簡単な方法はありますか?私は、プログラムによる解決策や、その仕事をするものなら何でも受け入れます。変数の 3 つの変数を並べて一致させるよりも簡単なものが欲しいだけです。

ありがとうございました。

4

1 に答える 1

2

はい、クローン作成には次のアプローチを使用できます。

1) オブジェクトのクローンを作成する Java シリアライゼーション メカニズム:

ByteArrayOutputStream bout = new ByteArrayOutputStream();
out = new ObjectOutputStream(bout);

out.writeObject(obj);
out.close();

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
in = new ObjectInputStream(bin);            
Object copy = in.readObject();

2) apache.commons.lang ライブラリにはorg.apache.commons.lang.SerializationUtils .clone()があります

3) dozerライブラリを使用する

4) ユーザーKyro、使用したことはありませんが

equals() にはorg.apache.commons.lang.builder.EqualsBuilder .reflectionEquals( ) を使用します

于 2013-02-03T02:18:37.557 に答える