Java对象复制最佳选择?

aeq*_*aeq 5 java object deep-copy default-copy-constructor

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

我需要在Java中复制一个对象(即通过值而不是通过引用复制对象,以便新对象不仅仅是对旧对象的引用).我厌倦了实现clonable并且更喜欢使用复制构造函数.但是,我需要复制的类有多个需要复制的成员变量(超过100个),所以在类中添加一个新的构造函数只是为了复制(只需要在我的应用程序的一部分中使用),这似乎是一个糟糕的解决方案由于它的长度很大.

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

我基本上只需要创建一个与旧对象相同的新对象,但是有一些(大约10个中的100个)字段已更改(但我仍然需要两个对象..所以新的对象不能作为对象的引用旧的).我对任何建议持开放态度.

Boz*_*zho 10

clone()制作浅层克隆 - 它只复制第一级字段.你应该避免使用clone()Cloneable,因为很难正确地实现它,并且很可能会破坏某些东西,尽管不能立即看到.看看Joshua Bloch对此的看法.

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

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

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


Bev*_*vor 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;
  }
}
Run Code Online (Sandbox Code Playgroud)