如何制作对象的深度副本?

2022-08-31 04:51:58

实现深度对象复制功能有点困难。您采取了哪些步骤来确保原始对象和克隆对象没有共享引用?


答案 1

一种安全的方法是序列化对象,然后反序列化。这确保了一切都是全新的参考。

这是一篇关于如何有效地做到这一点的文章。

注意事项:类可以重写序列化,以便创建新实例,例如对于单例。此外,如果您的类不可序列化,这当然不起作用。


答案 2

有些人提到使用或覆盖 。别这样。 有一些重大问题,在大多数情况下不鼓励使用它。请参阅Joshua Bloch的“Effective Java”中的第11项,以获取完整的答案。我相信你可以安全地在基元类型数组上使用,但除此之外,你需要明智地正确使用和覆盖克隆。Object.clone()Object.clone()Object.clone()

依赖于序列化(XML 或其他)的方案是笨拙的。

这里没有简单的答案。如果要深度复制对象,则必须遍历对象图,并通过对象的复制构造函数或静态工厂方法显式复制每个子对象,而静态工厂方法又会深度复制子对象。不可变项(例如 s)不需要复制。顺便说一句,出于这个原因,您应该支持不可变性。String