有效的Java.可克隆的界面

MyT*_*tle 1 java cloneable effective-java

我阅读了有效的Java书,并且不了解一个解释Clonable接口的段落.有人可以解释一下这段话:

程序员假设如果他们扩展一个类并super.clone从子类调用 ,则返回的对象将是子类的一个实例.超类可以提供此功能的唯一方法是返回通过调用获得的对象super.clone.如果clone方法返回由构造函数创建的对象,则它将具有错误的类.

谢谢.

cor*_*iKa 6

我应该首先注意到clone它本身就被打破了,而且复制构造函数就像Sheep(Sheep cloneMe)一个更优雅的习语clone,考虑到Cloneable合同非常弱.你可能已经知道了这一点,因为你正在读这本书,但值得投入这里.

无论如何,要回答这个问题:

Object.clone()将创建一个与调用它的对象相同类型的对象.出于这个原因,强烈建议"级联"以Object获得您计划返回的结果.如果有人决定不遵循这个约定,你最终会得到一个破坏约定的类类型的对象,这将导致许多问题.

为了说明我有一个这样的课程

class Sheep implements Cloneable {

    Sheep(String name)...

    public Object clone() {
        return new Sheep(this.name); // bad, doesn't cascade up to Object
    }
}

class WoolySheep extends Sheep {

    public Object clone() {
        return super.clone();
    }
}
Run Code Online (Sandbox Code Playgroud)

突然,如果我这样做

WoolySheep dolly = new WoolySheep("Dolly");
WoolySheep clone = (WoolySheep)(dolly.clone()); // error
Run Code Online (Sandbox Code Playgroud)

我会得到一个例外,因为我得到的dolly.clone()是一个Sheep,而不是一个WoolySheep.

  • @MyTitle - 你误读了书中的引用.使用`super.clone`是_correct_实现. (3认同)