`
tigers20010
  • 浏览: 47144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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呢???

0
1
分享到:
评论
5 楼 z276356445t 2010-12-13  
刚刚我也看了下这个原型设计模式,就你目前的情况来看,你是用的浅拷贝吧,如果要深拷贝的话,你的成员变量必须也要重新拷贝一个,然而在你客户端进行引用的时候只能对你拷贝的对象进行赋值才能达到你理想的结果,你可以这样改.
public BtripRevision clone() throws CloneNotSupportedException {
this.btripApplication = (BtripApplication)this.btripApplication.clone();
return (BtripRevision) super.clone();
}

客户端应该这样去访问:
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);
b3.setBtripApplication(b1);
System.out.println("b2=" + b2.getBtripApplication().getA());
System.out.println("b3=" + b3.getBtripApplication().getA());
System.out.println("b2=" + b2 + "--------b3=" + b3);
}
4 楼 tigers20010 2010-06-25  
mercyblitz 写道
tigers20010 写道
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道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();
}也不行啊,不知道是为何?感觉那位老兄讲的原型模式,不是太清楚额?
3 楼 mercyblitz 2010-06-25  
tigers20010 写道
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道b1没有进行深拷贝??



恩,这个时候b2和b3引用了同一个b1。

clone并没有深入下去。没有生成一个新的b1。
2 楼 tigers20010 2010-06-25  
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道b1没有进行深拷贝??
1 楼 mercyblitz 2010-06-25  
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。

相关推荐

    详解Java中的clone方法?原型模式

     clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    原型模式实践代码

    原型模式实践代码

    Java中的clone方法详解_动力节点Java学院

    Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    java面试题.pdf

    10道Java面试题及详细解答 1.Java中多态的实现方式是什么? 2. Java中如何避免空指针异常? 3. Java中垃圾回收的机制是什么?...8. Java中如何防止对象的clone? 9. Java中什么是泛型? 10. Java中如何实现单例模式?

    java设计模式

    13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介...

    java_clone用法

    java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。

    Java深浅clone

    Java深浅clone测试代码 流拷贝 Cloneable

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    java clone的小例子

    用 Java 语言编写的 初学者可学习的clone()

    java clone

    对java clone的一些讲解,以及我个人的一些心得等等,

    设计模式 创建型模式 Prototype模式(原型)

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    Java中的克隆(Clone)机制

    现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的...

    java中的指针,引用及对象的clone

    java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。

    java code clone

    java code clone

    java中clone的用法实例

    clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解

    Java原型设计模式(Prototype)

    1、定义  原型模式(Prototype)是通过复制一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例是我们所称的...  (1)利用Java中的clone方法深拷贝与浅拷贝  浅拷贝: public class Professor { pri

Global site tag (gtag.js) - Google Analytics