我想知道是否有推荐的方法在java中进行深度克隆/复制实例.
我有三个解决方案,但我可以错过一些,我想得到你的意见
编辑:包括Bohzo的提议和改进问题:它更多的是深度克隆而不是浅层克隆.
在属性之后通过hand属性编写克隆代码并检查是否也克隆了可变实例.
亲:
- 控制将要执行的操作
- 快速执行
缺点:
- 编写和维护繁琐
- 容易出错(复制/粘贴失败,缺少属性,重新分配的可变属性)
使用您自己的反射工具或外部帮助程序(如jakarta common-beans),可以轻松编写一个通用的复制方法,该方法可以在一行中完成工作.
亲:
- 易于编写
- 没有维护
缺点:
- 对发生的事情的控制较少
- 如果反射工具也没有克隆子对象,则容易出现可变对象的错误
- 执行速度较慢
使用为您执行此操作的框架,例如:
commons-lang SerializationUtils
Java Deep Cloning Library
Dozer
Kryo
亲:
- 与反思一样
- 更多地控制将要克隆的内容.
缺点:
- 即使在层次结束时,每个可变实例都被完全克隆
- 执行起来可能非常慢
javassit,BCEL或cglib可能用于生成专用克隆器,只需单手写入.为此目的,有人知道使用这些工具之一的lib吗?
我错过了什么?
你会推荐哪一个?
谢谢.
我有一个关于clone()Java中的方法的快速问题,用于super.clone()继承 - 我clone()从父按钮中一直调用父类中的方法.
该clone()方法应该返回该对象的副本,但是如果我在继承heirachy中有三个类并且调用super.clone()三次,为什么继承heirachy中的最高类(仅在类Object下)得到该类的副本回?
假设我们有三个类:A,B和C,其中A - > B - > C(inherit = - >)
然后super.clone()在C类中调用,调用clone()B调用super.clone(),clone()在A中调用,调用super.clone()'this this Object.clone()被调用'.为什么它不是this从A类返回的对象的副本Object.clone()?这听起来很合乎逻辑.
我知道使用这种克隆机制并不是一个好主意(因为它像某些作者所说的那样"破坏"),尽管我需要帮助理解它是如何工作的.我们给出了以下类层次结构:
class N implements Cloneable{
protected int num;
public N clone() throws CloneNotSupportedException{
return (N)super.clone();
}
}
class M extends N{
protected String str;
public M clone() throws CloneNotSupportedException{
M obj = (M)super.clone();
obj.setString(new String(this.str));
return obj;
}
void setString(String str){
this.str = str;
}
}
Run Code Online (Sandbox Code Playgroud)
自从N扩展后Object,如何super.clone()返回一个实例N?super.clone()实际上Object.clone()是返回对类对象的引用Object.那我们为什么能把它投到N?N有一个num不在课堂上的成员Object.默认行为如何实际设法自动克隆此变量(因为它在类中没有它的记录Object)?
此外,M也是如此.M.clone()我们将一个对象从类N(返回super.clone())转换为类的对象M.我知道所有这些都是有效的,但我不明白为什么.