gpt4 book ai didi

java - 对象Java的深拷贝

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:31 25 4
gpt4 key购买 nike

我正在尝试克隆 MyGraph 的一个对象,我希望它是一个深拷贝,以便对象内的数组列表也被克隆。现在我有:

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 时返回一个错误。我不确定这是否是将数组列表添加到对象的正确方法。

最佳答案

ArrayList 中的clone 操作返回对象的浅拷贝,不适合您的目的。手动解决方法是:

  1. 创建一个与源列表大小相同的目标数组列表
  2. 迭代源列表并为它的每一项创建一个克隆到目标列表中

显然,这仅在数组列表包含实现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 序列化与反射 hack 和/或字节代码检测相结合,以使整个对象层次结构完全可序列化。您可能需要也可能不需要。

复制工具

例如,Dozer , 提供快速的深拷贝功能。 Orika也可以实现相同的效果,尽管配置更多:

public MyGraph deepCopy() {
final DozerBeanMapper mapper = new DozerBeanMapper();
final QuicksortTest clone = mapper.map(this, MyGraph.class);
return clone;
}

当然,唯一的缺点是您需要将额外的依赖项引入到您的项目中。

总的来说,您的deepCopy 方法应该是静态的。此外,您应该认真考虑通过将对象设为私有(private)并实现 getter/setter 来封装对象的状态。

关于java - 对象Java的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15155108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com