提问人:Jothi 提问时间:3/12/2010 最后编辑:Jason NicholsJothi 更新时间:9/25/2013 访问量:193674
Clone() vs Copy 构造函数 - 在 java [duplicate] 中推荐
Clone() vs Copy constructor- which is recommended in java [duplicate]
问:
Java 中的克隆方法与复制构造函数。哪一个是正确的解决方案。每个案例在哪里使用?
答:
克隆已损坏,因此请勿使用它。
Object 类的 CLONE 方法 是一种有点神奇的方法,确实如此 任何纯 Java 方法都无法做到的 do:它生成一个相同的副本 它的对象。它已经存在于 primordial Object 超类,因为 Java 的 beta 发布日 编译器*;它,就像所有古代一样 魔术,需要适当的 咒语以防止咒语 出乎意料的适得其反
首选复制对象的方法
Foo copyFoo (Foo foo){
Foo f = new Foo();
//for all properties in FOo
f.set(foo.get());
return f;
}
阅读更多 http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx
评论
clone()
clone()
clone()
请记住,这不是开箱即用的。您必须实现并覆盖 中的 making 方法。clone()
Cloneable
clone()
public
有一些替代方案,这些替代方案是可取的(因为该方法有很多设计问题,如其他答案所述),并且复制构造函数需要手动工作:clone()
BeanUtils.cloneBean(original)
创建一个浅克隆,就像 创建的克隆一样。(这个类来自 commons-beanutilsObject.clone()
)SerializationUtils.clone(original)
创建深度克隆。(即克隆了整个属性图,而不仅仅是第一级)(来自 commons-lang),但所有类都必须实现Serializable
Java 深度克隆库提供深度克隆,无需实现
Serializable
评论
另请参阅:如何正确覆盖克隆方法?。克隆在 Java 中被破坏了,很难把它做好,即使它做到了,它也没有真正提供太多,所以它真的不值得麻烦。
评论
final
java.lang.Object
请记住,复制构造函数将类类型限制为复制构造函数的类类型。请看以下示例:
// Need to clone person, which is type Person
Person clone = new Person(person);
如果可能是 的子类(或者是接口),则不起作用。这就是 clone 的全部意义所在,因为它可以在运行时动态克隆正确的类型(假设 clone 已正确实现)。person
Person
Person
Person clone = (Person)person.clone();
或
Person clone = (Person)SomeCloneUtil.clone(person); // See Bozho's answer
现在可以是正确实现的任何类型的假设。person
Person
clone
评论
new
super.clone()
clone
super.clone()
super.clone()
super.clone()
new
clone()
new
clone()
clone()
SomeCollection<T>
T
clone()
T
clone() 在设计时有几个错误(请参阅此问题),因此最好避免它。
摘自 Effective Java 第 2 版,第 11 项:明智地覆盖克隆
考虑到与 Cloneable 相关的所有问题,可以肯定地说 其他接口不应扩展它,并且类 为继承而设计(第 17 项)不应实现它。以 它有很多缺点,一些专家程序员干脆选择永远不这样做 重写 clone 方法,并且永远不要调用它,除非 复制数组。如果设计用于继承的类,请注意,如果 您选择不提供行为良好的受保护克隆方法,它 子类将无法实现 Cloneable。
本书还介绍了复制构造函数相对于可克隆/克隆的许多优势。
- 它们不依赖于容易出现风险的语言外对象创建机制
- 他们并不要求无法强制遵守记录薄弱的公约
- 它们与正确使用最终字段不冲突
- 它们不会抛出不必要的检查异常
- 他们不需要石膏。
所有标准集合都具有复制构造函数。使用它们。
List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);
评论
original
ArrayList
LinkedList
非常可悲的是:Cloneable/clone 和构造函数都不是很好的解决方案:我不想知道实现类!!(例如 - 我有一个地图,我想复制它,使用相同的隐藏 MumbleMap 实现)我只想制作一个副本,如果支持这样做的话。但是,唉,Cloneable 上面没有 clone 方法,所以没有什么可以安全地对它进行类型转换来调用 clone()。
无论最好的“复制对象”库是什么,Oracle 都应该让它成为下一个 Java 版本的标准组件(除非它已经存在,隐藏在某个地方)。
当然,如果更多的库(例如 - 集合)是不可变的,那么这个“复制”任务就会消失。但随后我们将开始使用诸如“类不变量”之类的东西来设计 Java 程序,而不是 verdammt 的“bean”模式(创建一个损坏的对象并变异直到足够好)。
评论
上一个:动态分配对象数组
评论
clone