4

如果一个类不是Cloneable这个类的任何对象都可以被克隆。那为什么clone()保留在Object类中而不是Cloneable界面中?

4

2 回答 2

2

这是 Java 的设计错误(是的,Java 并不完美!)。

最好避免在 Java 中进行克隆。例如 Josh Bloch 在 Effective Java, Item 11 中指出:

Cloneable 接口旨在作为一个 mixin 接口(第 18 项),让对象宣传它们允许克隆。不幸的是,它无法达到这个目的。它的主要缺陷是它缺少一个克隆方法,而对象的克隆方法是受保护的。如果不借助反射(第 53 条),您不能仅仅因为它实现了 Cloneable 就在对象上调用 clone 方法。即使是反射调用也可能失败,因为不能保证对象具有可访问的克隆方法。尽管存在这个缺陷和其他缺陷,但该设施已被广泛使用,因此了解它是值得的。

如果您希望您的对象可克隆,请实现复制构造函数或复制方法。

于 2011-09-14T06:45:45.513 回答
0
  1. Cloneable 是一个标记接口,类似于用户/开发人员查看该类是否为 clonebale 的属性。

  2. clone() 保存在 Object 类中,因为在您的 clone() 实现中,建议您调用 super 的 clone(),这只有在超类具有克隆函数时才会发生,即使它没有标记为可克隆(通过实现 Cloneable),因此将 clone() 函数保留在 Object 中是有意义的。

  3. clone() 完全创建了一个不同的类实例,就像构造函数一样,应该调用 super 的方法来创建一个完整的实例。

于 2011-09-14T06:44:39.427 回答