Java:深度克隆/复制实例的推荐解决方案

标签 java clone

我想知道是否有推荐的方法在 java 中进行实例的深度克隆/复制。

我有 3 个解决方案,但我可能会错过一些,我想听听您的意见

编辑:包括 Bohzo 命题并细化问题:它更多的是关于深度克隆而不是浅层克隆。

自己动手:

在属性之后手动编码克隆属性,并检查可变实例是否也被克隆。
专业人士:
- 控制将要执行的操作
- 快速执行
缺点:
- 编写和维护繁琐
- 容易出错(复制/粘贴失败、缺少属性、重新分配的可变属性)

使用反射:

使用您自己的反射工具或外部帮助程序(如 jakarta common-beans),很容易编写一个通用的复制方法,可以在一行中完成这项工作。
专业人士:
- 易于编写
- 无需维护
缺点:
- 对发生的事情的控制较少
- 如果反射工具也没有克隆子对象,那么可变对象容易出错
- 执行速度较慢

使用克隆框架:

使用为你做这件事的框架,例如:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo

专业人士:
- 和反射一样
- 更好地控制将被克隆的内容。
缺点:
- 每个可变实例都被完全克隆,即使在层次结构的末尾
- 执行起来可能很慢

使用字节码检测在运行时编写克隆

javassit , BCELcglib可用于生成专用克隆器,其速度与单手书写一样快。有人知道为此目的使用这些工具之一的库吗?

我在这里错过了什么?
你会推荐哪一个?

谢谢。

最佳答案

对于深度克隆(克隆整个对象层次结构):

  • commons-lang SerializationUtils - 使用序列化 - 如果所有类都在您的控制范围内,并且您可以强制实现 Serializable

  • Java Deep Cloning Library - 使用反射 - 在您想要克隆的类或对象超出您的控制(第 3 方库)并且您无法让它们实现 Serializable 的情况下,或者在您没有的情况下不想实现Serializable

对于浅层克隆(仅克隆第一级属性):

我故意省略了“自己动手”选项 - 上面的 API 很好地控制了要克隆​​和不克隆的内容(例如使用 transientString[ ] ignoreProperties),因此不建议重新发明轮子。

关于Java:深度克隆/复制实例的推荐解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156120/

相关文章:

git - 我需要做一个 Git 克隆吗?

javascript - 在 JavaScript 中克隆对象

java - 如何验证 DMN camunda 中的输入表达式

java - 使用 XML DOM 添加命名空间前缀 XML 字符串

java - (null != x) 和 (x != null) 之间有什么区别吗

CLONE_VM undeclared(第一次在这个函数中使用)

Java 文本匹配电子邮件

java - DecimalFormat 在舍入时是否不考虑小数值?

azure - 尝试克隆 Azure 管道但出现 "references service connection ... not found"错误

php - 如何使用 CakePhp 克隆/复制一条 sql 记录?