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>
}

问题是要确保我没有遗漏克隆方法中的任何值是一项艰巨的任务。将来我还想实现一个 equals() 函数,这意味着我必须手动同步 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)使用推土机

4)用户Kyro,虽然我从未使用过它

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

于 2013-02-03T02:18:37.557 回答