`

对object.clone方法的新认识

阅读更多

原来一直以为子类在重写Object.clone()方法时,需要额外把子类的新增属性也赋值给克隆对象,如下面的代码,other.setAddition(this.addition);我以前写clone 方法时都是加上这一句的。事实上这是不必要的,可以把这一句代码去掉。
要实现这种效果是有前提条件的:在Test类的父类链上,所有的父类必须提供clone方法,并且返回由调用super.clone方法获得的对象。如果任何一个父类的clone方法返回由构造函数创建的对象,这就会产生一个错误的类。当我们重写了clone方法,必须返回super.clone方法获得的对象。
如果遵循了以上规则,Object.clone方法会保证创建Test的实例。这一点看上去挺神奇的。

 

@Override
  public Test clone(){
    Test other = null;
    try{
     other = (Test) super.clone();
     //other.setAddition(this.addition);//事实上这句话可以不要的。
     return other;
    }catch(CloneNotSupportedException e){
      throw new AssertionError();
    }
  }

 

0
0
分享到:
评论
1 楼 changedi 2010-09-29  
只记得effective java里讲的好像是在写clone时,把那些成员最好都设置ok~~~
我觉得写上setXXX()挺好的~~~

相关推荐

Global site tag (gtag.js) - Google Analytics