我在网上寻找关于java克隆的教程,但只发现了clone()的缺点,而没有找到优点。我想知道使用Java clone()的一些优点。
答案 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()的一些优点是