java clone備忘

1.Object clone 就是複製一個對象的複本,在Factory模式中比較常用。對象要實現Clone的功能,就必須implements Clonable interface, 事實上,這是一個沒有任何method的interface。對象的clone方法是Object類的方法,如果對象沒有implements Clonable,就會throw CloneNotSupportedException.
 protected native Object clone() throws CloneNotSupportedException;


2.一個Object可能有基本數據類型,如:int,long,float,double等,也會含有非基本數據類型如數組,collection,自定義對象等。如果被克隆得到的對象基本類型的值修改了,原對象的值不會改變.這種就是shadow clone.


3.如果你要改變一個非基本類型的值時,原對象的值卻改變了,.比如一個數組,內存中只copy他的地址,而這個地址指向的值並沒有copy,當clone時,兩個地址指向了一個值,這樣一旦這個值改變了,原來的值當然也變了,因爲他們共用一個值.,這就必須得用deep clone。重載clone方法,對於非原始類型的對象,手動去作clone,這樣比較複雜,公用性不高,對於每個類都要去寫一套。

4.序列化/反序列化方式實現deepclone
如果source對象實現了Serializable接口,就可用這種方式來做deepclone,一段示例代碼
public Object deepClone(Object src) {
Object o = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(src);
oos.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos
.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
o = ois.readObject();
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return o;
}
發佈了19 篇原創文章 · 獲贊 0 · 訪問量 2933
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章