首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java原形模式(clone)之疑惑?

2012-10-16 
java原型模式(clone)之疑惑???????? 近期在javaeye看到一位兄弟写的java原型模式之理解。然后,自己就写了个

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);
}

热点排行