如果一个类不是Cloneable
这个类的任何对象都可以被克隆。那为什么clone()
保留在Object
类中而不是Cloneable
界面中?
2 回答
这是 Java 的设计错误(是的,Java 并不完美!)。
最好避免在 Java 中进行克隆。例如 Josh Bloch 在 Effective Java, Item 11 中指出:
Cloneable 接口旨在作为一个 mixin 接口(第 18 项),让对象宣传它们允许克隆。不幸的是,它无法达到这个目的。它的主要缺陷是它缺少一个克隆方法,而对象的克隆方法是受保护的。如果不借助反射(第 53 条),您不能仅仅因为它实现了 Cloneable 就在对象上调用 clone 方法。即使是反射调用也可能失败,因为不能保证对象具有可访问的克隆方法。尽管存在这个缺陷和其他缺陷,但该设施已被广泛使用,因此了解它是值得的。
如果您希望您的对象可克隆,请实现复制构造函数或复制方法。
Cloneable 是一个标记接口,类似于用户/开发人员查看该类是否为 clonebale 的属性。
clone() 保存在 Object 类中,因为在您的 clone() 实现中,建议您调用 super 的 clone(),这只有在超类具有克隆函数时才会发生,即使它没有标记为可克隆(通过实现 Cloneable),因此将 clone() 函数保留在 Object 中是有意义的。
clone() 完全创建了一个不同的类实例,就像构造函数一样,应该调用 super 的方法来创建一个完整的实例。