一个对象要想被Clone,那么要实现Clone()接口,这个接口没有定义任何的方法,但是如果你不实现这个接口的话,调用clone方法的时候会出现 CloneNotSupportedException,这就是作者叫做mixin的接口类型。通常clone()方法可以这样覆盖:
public Object clone()
{
try {
return super.clone();
}
catch(CloneNotSupportedException e) {
}
}
public Object clone() {
try {
return super.clone();
}catch(CloneNotSupportedException e){
}
}
但是当你要clone的类里面含有可修改的引用字段的时候,那么你一定要把整个类的蓝图进行复制,如果对你clone得到的对象进行修改的时候还会影响到原来的实例,那么这是不可取的。所以应该这样clone()
public Object clone() throws CloneNotSupportedException
{
Stack Result = (Stack)super.clone();
Result.elements = (Object[])elements.clone();
Return result;
}
public Object clone() throws CloneNotSupportedException
{
Stack Result = (Stack)super.clone();
Result.elements = (Object[])elements.clone();
Return result;
}
其中elements是stack类中可修改的引用字段,注意如果elements是final的话我们就无能为力了,因为不能给他重新赋值了.其实如果不是必须的话,根本就不用它最好。
clone方法如果实现得不当会给系统带来隐藏的bug,如果非要使用类似的功能最好的办法是提供某些其他的途径(拷贝构造函数或者提供一个静态工厂方法来替代构造函数)来替代对象的拷贝,或者干脆不提供这样的能力。
Cloneable有很多问题,所以安全的说,其他的接口不应该扩展(extend)这个接口,并且为了继承而设计的类也不应该实现(implement)这个接口。