java原型模式(clone)之疑惑???
????? 近期在javaeye看到一位兄弟写的java原型模式之理解。然后,自己就写了个demo,但是在使用colone时,好像出现了些问题??
?
定义如下几个类:
?
public class BtripApplication implements Cloneable{
?
?? private int a;
public int getA() {
?return a;
}
public void setA(int a) {
?this.a = a;
}
??
public BtripApplication clone() throws CloneNotSupportedException {
?return (BtripApplication)super.clone();
}
}
------------------------------------------------
?
public class BtripRevision implements Cloneable {
?
? private BtripApplication btripApplication;
?
? public BtripRevision(BtripApplication btripApplication){
?? this.btripApplication =? btripApplication;
? }
?
public BtripApplication getBtripApplication() {
?return btripApplication;
}
public void setBtripApplication(BtripApplication btripApplication) {
?this.btripApplication = btripApplication;
}
public BtripRevision clone() throws CloneNotSupportedException {
?return (BtripRevision)super.clone();
}
}
---------------------------------------------
public class TestBtripApplicationRevision {
? public static void main(String args[]) throws CloneNotSupportedException{
?? BtripApplication b1 = new BtripApplication();
?? b1.setA(1);
?? BtripRevision b2 = new BtripRevision(b1);
?? BtripRevision b3 =? b2.clone();
?? //b3.getBtripApplication().setA(3);
?? b1.setA(3);
?? System.out.println("b2="+b2.getBtripApplication().getA());
?? System.out.println("b3="+b3.getBtripApplication().getA());
?? System.out.println("b2="+b2+"--------b3="+b3);
? }
}
?
输出的结果为:b2=3
??????????????????? b3=3
为什么结果不是b2=1,b3=3呢???
恩,这个时候b2和b3引用了同一个b1。
clone并没有深入下去。没有生成一个新的b1。
恩,这个时候b2和b3引用了同一个b1。
clone并没有深入下去。没有生成一个新的b1。
现在我想b2.clone()时,b1也要进行深拷贝?(项目中有这种类似的需求,当时我是在每个modle里,写了个selfcopy()的方法,进行一一赋值的,想想真够麻烦的)。后来我将public BtripRevision clone() throws CloneNotSupportedException {
return (BtripRevision)super.clone();
}
改为public BtripRevision clone() throws CloneNotSupportedException {
btripApplication.clone();
return (BtripRevision)super.clone();
}也不行啊,不知道是为何?感觉那位老兄讲的原型模式,不是太清楚额?
System.out.println("b3=" + b3.getBtripApplication().getA());
System.out.println("b2=" + b2 + "--------b3=" + b3);
}