MyT*_*tle 1 java cloneable effective-java
我阅读了有效的Java书,并且不了解一个解释Clonable接口的段落.有人可以解释一下这段话:
程序员假设如果他们扩展一个类并
super.clone从子类调用 ,则返回的对象将是子类的一个实例.超类可以提供此功能的唯一方法是返回通过调用获得的对象super.clone.如果clone方法返回由构造函数创建的对象,则它将具有错误的类.
谢谢.
我应该首先注意到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.
| 归档时间: |
|
| 查看次数: |
2156 次 |
| 最近记录: |