复制构造函数vs Cloneable。我为什么不考虑Cloneable?

时间:2015-07-24 06:00:22

标签: java object copy-constructor cloneable

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

  

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

但是,我在这里做了

        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 over Cloneable的原因。

1 个答案:

答案 0 :(得分:4)

您没有将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数组。