2010-06-30 106 views
1

我搜索了一下,看到了一些提示,但仍然無法找到解決我手中的問題的方法:我需要完全複製一個現有的java對象,而不是創建對現有對象的引用。我沒有這個類的訪問權限,它通過它的父類實現了一個克隆方法,它實際上創建了一個引用。我嘗試着使用「序列化/反序列化」路線,它在某種程度上工作,但副本與原始副本不完全相同。 這可以完成嗎? 在此先感謝!如何在Java中複製對象?

大衛

+0

定義「FAITHFUL」,這不是一個藝術術語。 – 2010-06-30 16:40:33

+0

你看過深色的圖書館嗎? http://robust-it.co.uk/clone/ – 2010-06-30 16:41:01

+0

這通常是一個壞主意。我的意思是,你想要一個淺的副本還是一個深的副本?有多深?你的整個程序是否應該被複制?如果你沒有這個文件的副本,你怎麼知道它不是指你不應該複製的東西,或者有可能拋出的內部靜態引用?是否真的沒有其他可能的設計可以使用? – 2010-06-30 16:50:15

回答

2

在一般情況下,你不應該和你不能。

爲什麼你不應該:

有對象不應該是cloned- ESP。那些引用了你的軟件控制之外的資源 - 複製它們可能會導致混亂。

爲什麼你不能:如果該對象引用的所有對象被克隆

序列化和反序列化只會工作是序列化的。

你可以寫一個使用反射實例化新對象,並作出深刻克隆一些代碼深克隆遞歸所有領域,不過,要實現可深克隆此對象的一個​​方法:

public class Evil { 
    public Evil() { 
     throw new RuntimeException(); 
    } 
} 

問題的關鍵在於,如果我沒有弄錯,通過反射進行克隆總是依賴於通過Reflection調用構造函數,並且構造函數不保證能夠工作。

但是,在大多數情況下,這種方法會克隆大多數對象。但你仍然不應該這樣做!我無法想到這樣做的有效方案。

編輯:另外,正如一些評論者指出的,「忠實副本」的定義很不明確。

編輯2:結論:只有一個類可以知道它是否應該是可複製的以及如何去做。

1

嘗試Java deep cloning library

Cloner cloner = new Cloner(); 
cloner.deepClone(object); 
+0

這看起來也很有趣,如果它能夠達到它的要求。我會看看這個圖書館,謝謝! – 2010-06-30 17:31:13