有關對象的克隆克隆的方法

有關對象的克隆,目前有兩種方式。 1.實現Cloneable接口並重寫Object類中的clone(),方法; 這裏的實現方法比較簡單,就是用該類中已有的參數變量去構造一個參數相同的新對象。這個克隆出來的對象,各類參數值相同,可是地址值是不一樣的。可是有一點,這種類多數須要帶有全部參數的構造方法使用起來不叫簡單。 2.實現Seriable接口,經過對象的序列化和反序列化實現克隆,能夠實現真正的深度克隆。工具

首先這個是要有一個工具類,工具類的參數爲被克隆對象,返回值爲克隆的新對象code

public class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }
    //這裏須要注意泛型的使用
    public static <T> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);

        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();

        // 說明:調用ByteArrayInputStream或ByteArrayOutputStream對象的close方法沒有任何意義
        // 這兩個基於內存的流只要垃圾回收器清理對象就可以釋放資源,這一點不一樣於對外部資源(如文件流)的釋放
    }
}

咱們通常使用第二種,由於基於序列化和反序列化實現的克隆不單單是深度克隆,更重要的是經過泛型限定,能夠檢查出要克隆的對象是都支持序列化,折現個檢查是編譯器完成的,不是在運行時排除異常,這種方案明顯比Object的clone方法好,把問題在編譯是暴露,而不是運行時。對象

相關文章
相關標籤/搜索