【问题标题】:Is there an easier way to clone an object with dozens of member variables? [duplicate]有没有更简单的方法来克隆具有数十个成员变量的对象? [复制]
【发布时间】:2013-01-18 02:14:02
【问题描述】:

可能重复:
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 个位置的数据。不愉快。

有没有更简单的方法可以做到这一点?我愿意接受程序化解决方案或其他任何可以完成这项工作的东西。我只想有一些比查看三个并排和匹配变量更容易的东西。

谢谢。

【问题讨论】:

  • 你有一个包含 100-200 个字段的类?
  • 汤姆:是的。这是一个非常小的文件,描述了一个落块游戏的单个级别。游戏是高度可配置的,因此有很多变量可以代表所有这些选项。

标签: java clone


【解决方案1】:

是的,您可以使用以下方法进行克隆:

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()

【讨论】:

  • 序列化方式有速度问题吗?如果没有,这似乎是一个完美的解决方案。
  • 序列化应该比 dozer 或 Kyro 快得多,因为它不使用反射。
  • 与我上面描述的手写方法相比,您认为它的速度如何?只要没有主要的速度问题,那么这个解决方案就是我正在寻找的解决方案。该类不会被克隆太多。每当加载新的关卡系统时 10-25 次。因此,只要不存在明显的速度问题,这听起来就是诀窍。
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2013-07-07
  • 2023-03-21
相关资源
最近更新 更多