当前位置: 首页 > 面试题库 >

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

顾乐心
2023-03-14
问题内容

我想知道是否有推荐的方法可以在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集合的实用程序: Arrays Lists Maps 注意:更喜欢一些不使用序列化但使用Object.clone()方法的解决方案。我可以确定我的自定义对象将实现clone()方法,并且仅使用可克隆的Java标准类… 问题答案: 我认为以前的绿色答案很不好,为什么你会问? 它添加了很多代码 它要求你列出所有要复制的字段并执行此操作 当使用clone()时,这对

  • 问题 你想复制一个对象,包含其所有子对象。 解决方案 clone = (obj) -> if not obj? or typeof obj isnt 'object' return obj if obj instanceof Date return new Date(obj.getTime()) if obj instanceof RegExp flags

  • 本文向大家介绍JavaScript浅层克隆与深度克隆示例详解,包括了JavaScript浅层克隆与深度克隆示例详解的使用技巧和注意事项,需要的朋友参考一下 1 相关知识点 浅克隆就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容也相同,其中一个变化另一个内容也会变化。 深克隆就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象

  • 问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项

  • 本文向大家介绍深入理解Java中的克隆,包括了深入理解Java中的克隆的使用技巧和注意事项,需要的朋友参考一下 前言 Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。 对于克隆(Clone),Java有一些限制:       1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例

  • deepClone 对象深度克隆 注意 由于JS对象包括的范围非常广,加上ES6又有众多的新特性,很难、也没必要做到囊括所有的类型和情况,这里说的"对象",指的是普通的对象,不包括修改对象原型链, 或者为"Function","Promise"等的情况,请留意。 场景: 我们平时可能会遇到需要通过console.log打印一个对象,至执行打印的时刻,此对象为空,后面的逻辑中对此对象进行了修改赋值,