我想知道是否有推荐的方法在 java 中进行实例的深度克隆/复制。
我有 3 个解决方案,但我可能会错过一些,我想听听你的意见
编辑:包括 Bohzo 命题和细化问题:它更多的是关于深度克隆而不是浅克隆。
在属性之后手动对克隆进行编码,并检查是否也克隆了可变实例。 优点: - 控制将要执行的内容 - 快速执行 缺点: - 编写和维护繁琐 - 容易出错(复制/粘贴失败、缺少属性、重新分配的可变属性)
使用您自己的反射工具或外部助手(如 jakarta common-beans),很容易编写一个通用的复制方法,它可以在一行中完成这项工作。 优点: -易于编写 -无需维护 缺点: -对发生的事情的控制较少 -如果反射工具也没有克隆子对象,则可变对象容易出错 -执行速度较慢
使用一个为你做这件事的框架,比如: commons-lang SerializationUtils Java Deep Cloning Library Dozer Kryo
亲: - 与反射相同 - 更多地控制将被克隆的内容。 缺点: - 每个可变实例都被完全克隆,即使在层次结构的末尾 - 执行起来可能非常慢
javassit、BCEL或cglib可用于生成专用克隆器,其速度与手写速度一样快。有人知道为此目的使用这些工具之一的库吗?
我在这里错过了什么? 你会推荐哪一个?
谢谢。
commons-lang SerializationUtils - 使用序列化 - 如果所有类都在您的控制范围内并且您可以强制实现Serializable.
Serializable
Java Deep Cloning Library - 使用反射 - 在您想要克隆的类或对象超出您的控制(第 3 方库)并且您无法实现它们的情况Serializable下,或者在您不想实现的情况下Serializable.
commons-beanutils BeanUtils - 在大多数情况下。
Spring BeanUtils - 如果您已经在使用 spring 并因此在类路径中有此实用程序。
我故意省略了“自己动手”选项——上面的 API 很好地控制了克隆什么和不克隆什么(例如使用transient, 或String[] ignoreProperties),因此不建议重新发明轮子。
transient
String[] ignoreProperties