8

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

4

3 回答 3

10

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

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

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

但正如您所知道的,克隆会在继承框架中引发问题,并且会使原本轻量级的数据类变得混乱,所以除非有业务需求,否则我不会让对象可克隆。

于 2013-05-02T02:15:16.013 回答
3

我认为您无法找到有关克隆优势的任何信息的原因是其优势是隐含的:拥有(据说)简单的方法来创建原始对象的精确副本。

但不幸的是,Java 通过 clone() 和 Cloneable 的内置克隆机制有太多需要考虑的缺点,主要与它对类设计的可怕影响有关。Josh Bloch 在他的《 Effective Java》一书中有一整节介绍了为什么不应该使用 clone() 或 Cloneable,在一次采访中简要总结了这一点。

一般的建议是使用复制构造函数而不是使用 clone() 或 Cloneable,尽管您仍然必须决定浅拷贝还是深拷贝是合适的。您还可以使用 Serializable 或 JAXB 等序列化 API 以及各种克隆库来创建深度克隆。您可以在相关问题Java:推荐的深度克隆/复制实例解决方案中找到非常好的讨论。

于 2013-05-02T04:25:42.883 回答
0

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

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

您可以阅读有关Java 克隆的更多信息 - 复制构造函数与克隆

于 2017-01-15T19:00:23.183 回答