黑马程序员技术交流社区

标题: 深度clone的实现方式? [打印本页]

作者: 最初的理想    时间: 2012-2-8 06:28
标题: 深度clone的实现方式?
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径。
一、浅度克隆 对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅复制一份引用给新产生的对象,即新产生的对象和原始对象中的非基本数据类型的属性都指向的是同一个对象 基本代码如下:
public class CloneableObjExample implements Cloneable {

//……部分代码已省略……

private String name = null;

private int score = 0;

/**

* NOTE: 将protected 修饰符 更改为 public

* @see java.lang.Object#clone()

*/

public Object clone() throws CloneNotSupportedException {

// call父类的clone方法

Object result = super.clone();

//TODO: 定制clone数据

return result;

}

}
二、深度克隆
在浅度克隆的基础上,对于要克隆的对象中的非基本数据类型的属性对应的类,也实现克隆,这样对于非基本数据类型的属性,复制的不是一份引用,即新产生的对象和原始对象中的非基本数据类型的属性指向的不是同一个对象。深度克隆的过程也是一个递归的过程如果对象非常复杂,那么克隆的过程也非常复杂。目前看到的深度克隆方式中,利用对象的序列化特性实现深度克隆是最简单的方式。代码如下:
public class Attribute {   
    private String no;   
}   
   
public class Product {   
    private String name;   
        
    private Attribute attribute;   
   
    public Product clone() {   
        ByteArrayOutputStream byteOut = null;   
        ObjectOutputStream objOut = null;   
        ByteArrayInputStream byteIn = null;   
        ObjectInputStream objIn = null;   
            
        try {   
            byteOut = new ByteArrayOutputStream();     
            objOut = new ObjectOutputStream(byteOut);     
            objOut.writeObject(prototype);   
   
            byteIn = new ByteArrayInputStream(byteOut.toByteArray());   
            objIn = new ObjectInputStream(byteIn);   
               
            return (ContretePrototype) objIn.readObject();   
        } catch (IOException e) {   
            throw new RuntimeException("Clone Object failed in IO.",e);      
        } catch (ClassNotFoundException e) {   
            throw new RuntimeException("Class not found.",e);      
        } finally{   
            try{   
                byteIn = null;   
                byteOut = null;   
                if(objOut != null) objOut.close();      
                if(objIn != null) objIn.close();      
            }catch(IOException e){      
            }      
        }   
    }   
}  
如果利用递归实现对象的深度克隆思路又是怎么样的呢?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2