Java克隆的优点

时间:2013-05-02 01:57:27

标签: java cloneable

我在网上寻找关于java克隆的教程,但只发现了clone()的缺点,而没有找到优点。我想知道使用Java clone()的一些优点。

3 个答案:

答案 0 :(得分:10)

克隆肯定有其用途。想象一下任何类型的业务应用程序,其中您有对象表示的数据记录,您可以“另存为”(重复和重命名)。如果该数据保存在实现Cloneable接口的对象中,那么您可以克隆原始数据并使用新信息更新它。

这优于创建新对象实例并显式复制所有数据。有些人用辅助类和复制方法来解决这个问题,但是你有了复制类本身以外的类所需的信息,这是一个糟糕的OO编程。

我喜欢的另一个用例是当我使用类作为GUI的后备存储并且GUI具有重置按钮时。初始化GUI时,我克隆了后备存储对象。然后,如果用户按下恢复,我只需将GUI重新初始化为克隆对象中的值,而不是确定它们可能已更改的信息或从存储中获取原始信息的新副本。肯定有很多用途。

但是正如您所知,克隆可能会在继承框架中引发问题并使其他轻量级数据类变得混乱,因此除非有业务需求,否则我不会使对象可克隆。

答案 1 :(得分:3)

我认为您无法找到有关克隆优势的原因是,优势是隐含的:有一种(据称)简单的方法来创建原始对象的精确副本。

但遗憾的是,Java通过clone()和Cloneable的内置克隆机制有太多不足之处需要考虑,主要与它对类设计的可怕影响有关。 Josh Bloch有一个完整的部分,介绍了为什么你不应该在他的书 Effective Java 中使用clone()或Cloneable,简要总结为interview

一般建议使用复制构造函数而不是使用clone()或Cloneable,尽管您仍需要确定浅复制还是深复制是否合适。您还可以使用序列化API(如Serializable或JAXB)以及各种克隆库来创建深度克隆。您可以在相关问题Java: recommended solution for deep cloning/copying an instance中找到一个非常好的讨论。

答案 2 :(得分:0)

Object.clone()有许多设计问题,但它仍然是复制对象的流行和最简单的方法。使用clone()的一些优点是

  • 这是实现克隆的最简单方法,即使对于古老的项目,您只需要定义一个父类,在其中实现Cloneable,提供clone()方法的定义,并准备好您父母的每个孩子将获得克隆功能。
  • 克隆需要非常少的代码行,如果您不需要深层复制,只需要一个带有4或5行长clone()方法的抽象类。
  • 克隆是复制数组的最快方法。
  • 从1.5版开始,在数组上调用clone返回一个数组,其编译时类型与克隆数组的类型相同,这显然意味着在数组上调用clone不需要类型转换。

您可以在Java Cloning - Copy Constructor versus Cloning

上阅读更多内容