我应该在java中使用克隆方法吗?

我应该在java中使用克隆方法吗?

问题描述:

我听说你应该在你的代码中避免它,但它是由于某种原因实现的,所以有没有一种情况是使用它实际上是一个好的(或不坏的)选择,或者我应该总是试图避免它?我应该在java中使用克隆方法吗?

+0

我不会说你应该避免它。像几乎所有东西一样,你可以使用它的正确或错误...阅读关于原型模式的东西,这就是你如何使用它的权利... – 2014-10-26 22:10:41

+0

如果不确定,请自己实施,或者如果可能,最好检查一下源代码。使用clone()的坑洞主要在于你不能总是知道它是否按预期工作(除非你测试它,当然)。例如,我很难得到一个int数组的克隆。然而,克隆的文档声明它应该返回一个对象的副本,所以我也在等待这个答案! – 2014-10-26 22:11:08

+2

17年来我从未使用过它,或者是“复制构造函数”。 – EJP 2014-10-26 22:16:13

Josh Bloch answered this perfectly:

如果你读过关于我的书克隆的项目,特别是如果你 字里行间,你会知道,我认为克隆深感 破碎。有一些设计缺陷,其中最大的问题是Cloneable接口没有克隆方法。这意味着它 根本不起作用:使可克隆的东西不会说什么 关于你可以用它做什么。相反,它说了一些关于它可以在内部做什么的东西。它说如果通过反复调用super.clone 它最终调用Object的克隆方法,该方法将返回原始字段副本 。

但是它没有说明你可以用 实现Cloneable接口的对象做什么,这意味着你不能做一个 多态克隆操作。如果我有一个Cloneable数组,你会认为我可以运行该数组并克隆每个元素 以创建数组的深层副本,但是我不能。您不能将 转换为Cloneable并调用克隆方法,因为Cloneable 没有公共克隆方法,也没有Object。如果您尝试使用 将其转换为Cloneable并调用克隆方法,编译器会说您尝试调用对象上的受保护克隆方法的 。

Cloneable被破坏是一种遗憾,但它发生了。原始 Java API在紧迫的最后期限内完成得非常迅速,以满足关闭市场窗口 。最初的Java团队做了一件令人难以置信的工作,但并不是所有的API都是完美的。 Cloneable是一个弱点,我认为人们应该意识到它的局限性。

+0

+1供参考 – 2014-10-26 22:15:41

您应该尝试始终根据对象类型覆盖克隆方法,但java clone()方法并不总是按照您的要求进行操作。

见:Deep copy, shallow copy, clone