5

可能重复:
如何在 Java 中复制对象?

我需要在 Java 中复制一个对象(即“按值而不是按引用”复制对象,以便新对象不仅仅是对旧对象的引用)。我厌倦了实现可克隆并且更喜欢使用复制构造函数。但是,我需要复制的类有许多需要复制的成员变量(超过 100 个),因此向该类添加一个新的构造函数只是为了复制(仅在我的应用程序的一部分中需要)似乎是一个糟糕的解决方案由于其巨大的长度。

有更好的解决方案吗?我应该只使用克隆()吗?我可以创建一个复制构造函数,但不是将所有字段一一复制,我可以反思吗?谢谢。

我基本上只需要创建一个与旧对象相同的新对象,但更改了一些(大约 100 个中的 10 个)字段(但我仍然需要两个对象..所以新对象不能作为对旧的)。我愿意接受任何建议。

4

3 回答 3

11

clone()进行浅克隆 - 它仅复制第一级字段。您应该避免使用clone()and Cloneable,因为它很难正确实现,而且很可能会损坏某些东西,尽管不是立即可见。看看Joshua Bloch对此有何评论。

如果您想要深层复制 - 即克隆整个对象层次结构,我可以建议两个选项:

但是,如果您想要浅拷贝 - 即您仍然希望将所有字段复制到一个新对象,但是字段和字段的字段(等)指向它们的原始值,那么您可以使用BeanUtils.clone(..)(来自commons-beanutils )

除了克隆问题 - 拥有 100 个成员变量并不是一个好兆头。考虑将你的类分成多个类(更新:和多个表,使用外键。当然,如果适用的话。如果这些确实是同一个对象的属性,那么很好)

于 2010-06-29T21:03:01.993 回答
8

一种选择是使用序列化。它不是最快的,但可能是最安全的之一。看看这个网站上的代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectputStream;
import java.io.ObjectOutputStream;

public class DeepObjectCopy {

  public static Object clone(Object copyObject) {
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(copyObject);
      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
      ObjectputStream ois = new ObjectputStream(bais);
      Object deepCopy = ois.readObject();
      return deepCopy;
    } catch (IOException e) {
      e.printStackTrace();
    } catch(ClassNotFoundException e) {
      e.printStackTrace();
    }
    return null;
  }
}
于 2010-06-29T21:06:42.890 回答
0

BeanUtils方法基于反射,因此它们(相对)缓慢。推土机和其他类似工具也是如此。复制构造函数是完成任务的最快方式,因此,如果您不是为Android等平台编写代码,而每个 kb 代码都是一个问题,那么您应该选择这种方式。如果唯一的问题是编写复制构造函数,您可以使用诸如JUtils 之类的 Eclipse 插件。

于 2012-03-23T08:26:10.013 回答