【问题标题】:Purpose of cloning in JavaJava中克隆的目的
【发布时间】:2015-04-14 08:37:18
【问题描述】:

我正在浏览 Java 的“特殊”功能,并开始阅读克隆。

所以目前我的理解是克隆可用于获取对象的相同副本。为此,您需要实现 Cloneable 接口并覆盖 Object 的 clone 方法(这在 IMO 中真的很奇怪)

我的问题更多是针对 C++ 和 Java 之间的比较。当我们已经支持复制构造函数时,为什么需要一个单独的克隆方法。克隆被认为是必须具备的特征是否有历史原因?

PS:我不是在问是否需要像what is the need of cloning a object in Java 那样“克隆”,我问的是当 Java 已经支持复制构造函数时需要 Cloneable 和 clone 方法。

【问题讨论】:

  • 嗯,它让clone() 使用更少的魔法。
  • 在 C++ 中,clone() 通常与多态一起使用,以从指针或对其基类的引用中获取派生类型的副本。所以它对复制构造函数有不同的用途。不知道Java有没有并行。
  • @juanchopanza:这就是它在 Java 中的使用方式。但是,我看不出如何在 C++ 中以类型安全的方式完成它。

标签: java c++ clone cloneable


【解决方案1】:

IMO 你的问题有两个部分。

Cloneable界面有什么需求?

Cloneable 接口也称为标记接口,这意味着它没有任何方法,它的全部目的是告诉您,该类的用户,它实现了 clone() 方法,继承自 Object。这使您可以在调用 clone() 方法之前进行检查:

Animal a = new Dog();
Animal b;
if (a instanceof Cloneable)
    b = a.clone();

这在 Java 中经常发生;例如,参见 Serializable 接口。

为什么 Java 需要 clone() 方法,因为它已经有复制构造函数?

非常简短的回答是多态性。如果没有 clone() 方法,如何通过引用 Animal 的超类来正确克隆 Dog 实例?

【讨论】:

    【解决方案2】:

    克隆旨在提供对象的单独实例,而不会破坏克隆的对象。在原型模式中非常有用(这是必须的)。

    复制构造函数通常在 C++ 中在按值传递时调用(您也可以在构造时使用它,但通常在将对象作为参数或返回值通过堆栈传递时调用它)。因此,初始对象经常超出范围。

    如果你真的想这样做,你最终可以将这两者互换,但实际上它们有不同的用途,明确何时应该使用一个而不是另一个是非常有帮助的。

    除了名称的歧义之外,您还需要考虑多态性,您希望从基指针克隆对象。

    将在指针类型上调用复制构造函数,而在最派生的实现上调用克隆(如果是虚拟的,应该是)。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2011-02-12
      • 2018-08-20
      相关资源
      最近更新 更多