Java:为什么设计用于继承的类应该包含受保护的克隆方法?

时间:2017-11-13 22:41:43

标签: java cloning effective-java

我仔细阅读了有效的Java(Joshua Bloch),我在克隆中找到了以下句子:

  

如果您设计了一个继承类,请注意,如果您选择不提供行为良好的受保护克隆方法,则子类将无法实现Cloneable。

我有点困惑,因为在我的小测试中:

public class Cloning {

    public static void main(String[] args) throws CloneNotSupportedException {

        Woman woman1 = new Woman("Marie Curie-Sklodowska", 33, "Physics");
        Woman woman2 = (Woman) woman1.clone();
    }

    static abstract class Person {
        protected String name;
        protected int age;

        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

    static class Woman extends Person implements Cloneable {

        private String field;

        Woman(String name, int age, String field) {
            super(name, age);
            this.field = field;
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
}

我没有收到任何错误。我想,我不理解这句话。有人可以解释,作者的想法是什么?

1 个答案:

答案 0 :(得分:0)

  

如果您设计了一个继承类,请注意,如果您选择不提供行为良好的受保护clone()方法,则子类将无法实现Cloneable

他错了。他们能。考虑:

public class A
{
    private int fieldA;
}

public class B extends A implements Cloneable
{
    public B clone() throws CloneNotSupportedException
    {
        return (B)super.clone();
    }
}

B.clone()将返回调用它的B实例的完美副本,包括A.fieldA。反例拒绝:QED

[我知道这个clone()不应该被声明为抛出CloneNotSupportedException,但它会使演示变得更简单。]

这一切都很好奇,因为他刚才说过几句话:

  

一些程序员只需选择永不覆盖clone()方法

  

为继承而设计的类不应该实现它[Cloneable]

更令人感到好奇的是,上面的第一句话是整个部分的最后一句,并且完全没有任何论据或例子支持,除非整个部分旨在证明它,它没有#&# 39;吨。整个部分都很混乱,很难弄清楚所要求的内容。克隆并不像他所说的那样难以理解或实施。也不重要。在20年的Java中,我还没有在严肃的代码中使用它,或者所谓的复制构造函数'任