【发布时间】:2011-01-10 11:57:00
【问题描述】:
我想知道是否有推荐的方法在 java 中进行实例的深度克隆/复制。
我有 3 个解决方案,但我可能会错过一些,我想听听您的意见
编辑:包括 Bohzo 命题并细化问题:它更多的是关于深度克隆而不是浅层克隆。
自己动手:
在属性之后手动对克隆进行编码,并检查是否也克隆了可变实例。
专业人士:
- 控制将要执行的操作
- 快速执行
缺点:
- 繁琐的编写和维护
- 容易出错(复制/粘贴失败、缺少属性、重新分配的可变属性)
使用反射:
使用您自己的反射工具或外部帮助程序(如 jakarta common-beans),很容易编写一个通用的复制方法,可以在一行中完成这项工作。
专业人士:
- 易于编写
- 无需维护
缺点:
- 较少控制发生的事情
- 如果反射工具也没有克隆子对象,则可变对象容易出错
- 执行速度较慢
使用克隆框架:
使用为您完成此任务的框架,例如:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo
专业人士:
- 与反射相同
- 更好地控制将要克隆的内容。
缺点:
- 每个可变实例都被完全克隆,即使在层次结构的末尾
- 执行起来可能很慢
使用字节码检测在运行时编写克隆
javassit、BCEL 或 cglib 可用于生成专用克隆器,其速度与单手书写一样快。有人知道为此目的使用这些工具之一的库吗?
我在这里错过了什么?
你会推荐哪一个?
谢谢。
【问题讨论】:
-
显然 Java 深度克隆库已移至此处:code.google.com/p/cloning