【问题标题】:Copy Constructor vs Cloneable. Why shouldn't I consider Cloneable?复制构造函数与可克隆。为什么我不应该考虑可克隆?
【发布时间】:2015-07-24 06:00:22
【问题描述】:

我在读这个answer,他提到了link,作者解释了为什么我们不应该使用Cloneable。但是,仍然怀疑那里所说的内容

如果我有一个 Cloneable 数组,你会认为我可以跑下来 该数组并克隆每个元素以制作数组的深层副本, 但我不能。 您不能将某些内容投射到 Cloneable 并调用克隆 方法,因为 Cloneable 没有公共克隆方法,并且 对象也没有。如果您尝试转换为 Cloneable 并调用 clone 方法,编译器会说你正在尝试调用 对象上的受保护克隆方法。

但是,我做到了

        Init s = Init.getInstance(); // getting instance
        int count=0;
        Cloneable[] v = new Cloneable[5]; // creating array
        Init x = s;
        Init y = new Init(s);
        try {
            while (count < 5) {
                v[count++] =  (Cloneable) s.clone(); // casting it.
            }

            s.setClassName("Example");
            System.out.println(((Init) v[2]).getClassName()); // Displaying.
        } catch (CloneNotSupportedException ex) {
            ex.printStackTrace();
        }

我能够创建 Cloneable 数组并且我做了作者所说的会导致错误或者我误解了作者的陈述?任何人,请帮助我了解选择 Copy Constructor 而不是 Cloneable 的原因。

【问题讨论】:

  • 我是 .net 开发人员,但 oops 概念在 Java 和 C# 中是相似的。根据我的理解,在 Copy Constructor 中,真实对象或复制对象的内存引用都是相同的。因此,当您更改真实对象,您会看到它也会影响复制的对象。在可克隆对象上,它们都有不同的内存引用,它们并不依赖于它们不会相互影响。

标签: java object copy-constructor cloneable


【解决方案1】:

您不会将s 转换为Cloneable,然后对其调用clone()。

相反,您调用s.clone(),然后将结果转换为Clonable。 您可以这样做,因为s 的类型为Init,而Init 具有public clone() 方法。

改为这样做,你会发现编译器在喊,

 v[count++] =  ((Cloneable) s).clone();

现在假设您要克隆一个数组(您显然只知道它是一个Cloneable 数组。这意味着您不知道它的实际类型。

Cloneable[] cloneArray = new Cloneable[5];
cloneArray[i] = new Init(); // Let's say it's initialized with different type objects but all `Cloneable`.

for (Cloneable object : cloneArray) {
      object.clone(); // Compiler wont allow it. And you don't know what type it is.
}

因此,您基本上无法深度克隆 Cloneable 数组。

【讨论】:

  • 没关系。但是,我要把它复制到 Cloneable array 中。对?那么,我为什么不应该选择 Cloneable 呢?
  • 不,这意味着你不能克隆一个可克隆的数组。检查我编辑的答案。
  • 那么,这就是复制构造函数和可克隆之间唯一的区别?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 2015-09-10
相关资源
最近更新 更多