是否有更简单的方法来克隆具有数十个成员变量的对象?

时间:2013-02-03 02:07:54

标签: java clone

  

可能重复:
  How to properly override clone method?

我有一个简单的类,其中包含一堆原始变量,总共约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>
}

问题在于确保我没有错过克隆方法中的任何值是一项任务。在将来,我还想实现一个equals()函数,这意味着我必须在3个地方手动同步数据。不愉快。

有没有更简单的方法来实现这一目标?我愿意接受编程解决方案或任何其他工作。我只想比看三个并排和变量匹配变量更容易。

谢谢。

1 个答案:

答案 0 :(得分: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,虽然我从未使用过它

for equals()使用org.apache.commons.lang.builder.EqualsBuilder .reflectionEquals()