`
schumee
  • 浏览: 24614 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第10条 --- 谨慎地改写clone

阅读更多

一个对象要想被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)这个接口。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics