【问题标题】:Why is the clone() method kept in Object?为什么将 clone() 方法保留在 Object 中?
【发布时间】:2011-11-16 17:59:58
【问题描述】:

如果一个类不是Cloneable,则不能克隆该类的任何对象。那为什么clone()保留在Object类中而不是Cloneable接口中呢?

【问题讨论】:

  • 这可能有点离谱,但它可能适用于某种形式的多态性,例如foreach Object 在一个集合中,尝试克隆它,如果它成功做一件事,如果它抛出异常做另一件事。
  • 阅读答案herehere 应该会对您有所帮助。
  • @Joachin 和 e-MEE 这些答案一点帮助都没有。他们说Cloneable 已“损坏”,但没有对 OP 提出的问题提供任何解释(即:“为什么将 clone() 方法保留在 Object 中?”)
  • @NullUserException, this particular answer helps 在每一位。在首次引入 Object 之后从 Object 中删除它会破坏 Sun 错误数据库条目的向后兼容性。答案就在 Java 历史的那个领域,为了我们的孩子,我们做出了决定并且不能改变。

标签: java cloneable


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:
    1. Cloneable 是一个标记接口,作用类似于用户/开发人员查看该类是否可克隆的属性。

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

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

    【讨论】:

    • 第 2 点是错误的:一个类可以总是调用super.clone(),因为Object 具有clone()。第 3 点在这里不相关,我不明白为什么要将 clone() 保留在 object 中。
    • 第 2 点说,克隆保存在 Object 中,以便它的任何子类都可以调用它(通过调用 super.clone()),即使它没有标记为可克隆。第 3 点的相关性是,当我们调用 super 的构造函数来创建实例时,同样我们也必须为 clone 执行此操作。不是强制性的,但强烈建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2012-05-05
    • 2014-05-17
    • 2011-08-13
    • 2018-05-11
    • 2010-11-07
    • 2013-08-16
    相关资源
    最近更新 更多