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

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

我有3个解决方案,但我可能会想念一些,我想征求你的意见

编辑:包括Bohzo命题,并提炼问题:更多是关于深克隆而不是浅克隆。

在属性之后手动编写代码,并检查是否也复制了可变实例。

-控制将执行的操作

-快速执行

-繁琐的编写和维护

-容易发生错误(复制/粘贴失败,缺少属性,重新分配了可变属性)

使用你自己的反射工具或外部帮助程序(例如jakarta common-beans),可以很容易地编写一个通用的复制方法,该方法可以在一行中完成此工作。

-易于编写

-没有维护

-对发生的事情的控制较少

-如果反射工具也不能克隆子对象,则易发生对象易变的错误

-执行速度较慢

使用克隆框架:

使用适合你的框架,例如:

commons-lang SerializationUtils

Java Deep Cloning Library

Dozer

Kryo

优点:

-与反射相同

-可以精确控制要克隆的内容。

缺点:

-每个可变实例都被完全克隆,即使在层次结构的末尾

-可能执行起来很慢

可以使用javassit,BCEL或cglib尽快生成专用克隆。有人知道为此目的使用这些工具之一的库吗?

我在这里错过了什么?

你会推荐哪一个?

回答:

commons-lang SerializationUtils-使用序列化-如果所有类都在你的控件中,并且你可以强制实施Serializable

Java深度克隆库 -使用反射-如果你要克隆的类或对象超出了你的控制范围(第三方库),并且你无法使其实现Serializable,或者在你不想实现时Serializable

commons-beanutils BeanUtils-在大多数情况下。

Spring BeanUtils-如果你已经在使用spring,因此在类路径上有此实用程序。

我特意省略了“自己动手”选项-上面的API提供了对克隆内容和不克隆内容的良好控制(例如,使用transient或String[] ignoreProperties),因此不建议重新发明轮子。

以上是 Java:深度克隆/复制实例的推荐解决方案 的全部内容, 来源链接: utcz.com/qa/429026.html

回到顶部