对象Java的深层副本
|
我正在尝试克隆MyGraph的一个对象,我希望它是一个深层复制,因此对象内的arraylists也被克隆.现在我有: public static MyGraph deepCopy(MyGraph G){
MyGraph Copy = (MyGraph) G.clone();
Copy.VertexG = (ArrayList<Integer>) G.VertexG.clone();
Copy.EdgeG = (ArrayList<String>) G.EdgeG.clone();
return Copy;
}
这会在尝试克隆arraylist时返回错误.我不确定这是否是将arraylists添加到对象的正确方法. 解决方法ArrayList中的clone操作返回对象的浅表副本,并不适合您的目的.手动解决方法是:>创建与源列表大小相同的目标阵列列表 显然,这只有在数组列表包含实现clone的项目时才有效,此外,项目clone操作实际上返回一个深层副本.换句话说,它不能保证.实际上,为Java对象实现深度克隆功能并不容易,请参考Java: recommended solution for deep cloning/copying an instance和其他SO线程中的大量讨论,以了解可用的选项.除了那里提供的答案,这里还有一些其他选择: 序列化 如果层次结构中的所有(必需的)对象都可以序列化,那么您可以使用这个简单的代码进行深度克隆: public MyGraph deepCopy() {
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream(256);
final ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
oos.close();
final ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(baos.toByteArray()));
final MyGraph clone = (QuicksortTest) ois.readObject();
return clone;
} catch (final Exception e) {
throw new RuntimeException("Cloning failed");
}
}
请注意,某些深度克隆库将标准Java序列化与反射黑客和/或字节代码检测相结合,以使整个对象层次结构完全可序列化.您可能需要也可能不需要. 复制工具 例如,Dozer,提供快速深层复制功能. Orika也可以实现相同的效果,尽管配置更多: public MyGraph deepCopy() {
final DozerBeanMapper mapper = new DozerBeanMapper();
final QuicksortTest clone = mapper.map(this,MyGraph.class);
return clone;
}
当然唯一的缺点是,您需要进入项目的额外依赖项. 在总切线上,您的deepCopy方法不应该是静态的.此外,您应该认真考虑通过将其设置为私有并实现getter / setter来封装对象的状态. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
