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对此的看法.
如果你想要深层复制 - 即整个对象层次结构被克隆,我可以建议两个选项:
Serializable,请使用SerializationUtils.clone(..)(来自commons-lang)但是,如果你想要浅拷贝 - 即你仍然想要将所有字段复制到一个新对象,但是字段和字段(等等)指向它们的原始值,那么你可以使用BeanUtils.clone(..)(来自commons-beanutils))
除了克隆问题 - 拥有100个成员变量并不是一个好兆头.考虑将您的类拆分为多个类(更新:和多个表,使用外键.当然,如果这是适用的.如果这些是同一个对象的真正属性,那么很好)
一个选项可以是使用序列化.它不是最快的,但可能是最安全的.看看这个网站上的代码:
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)