我搜索了一下,看到了一些提示,但仍然無法找到解決我手中的問題的方法:我需要完全複製一個現有的java對象,而不是創建對現有對象的引用。我沒有這個類的訪問權限,它通過它的父類實現了一個克隆方法,它實際上創建了一個引用。我嘗試着使用「序列化/反序列化」路線,它在某種程度上工作,但副本與原始副本不完全相同。 這可以完成嗎? 在此先感謝!如何在Java中複製對象?
大衛
我搜索了一下,看到了一些提示,但仍然無法找到解決我手中的問題的方法:我需要完全複製一個現有的java對象,而不是創建對現有對象的引用。我沒有這個類的訪問權限,它通過它的父類實現了一個克隆方法,它實際上創建了一個引用。我嘗試着使用「序列化/反序列化」路線,它在某種程度上工作,但副本與原始副本不完全相同。 這可以完成嗎? 在此先感謝!如何在Java中複製對象?
大衛
在一般情況下,你不應該和你不能。
爲什麼你不應該:
有對象不應該是cloned- ESP。那些引用了你的軟件控制之外的資源 - 複製它們可能會導致混亂。
爲什麼你不能:如果該對象引用的所有對象被克隆
序列化和反序列化只會工作是序列化的。
你可以寫一個使用反射實例化新對象,並作出深刻克隆一些代碼深克隆遞歸所有領域,不過,要實現可深克隆此對象的一個方法:
public class Evil {
public Evil() {
throw new RuntimeException();
}
}
問題的關鍵在於,如果我沒有弄錯,通過反射進行克隆總是依賴於通過Reflection調用構造函數,並且構造函數不保證能夠工作。
但是,在大多數情況下,這種方法會克隆大多數對象。但你仍然不應該這樣做!我無法想到這樣做的有效方案。
編輯:另外,正如一些評論者指出的,「忠實副本」的定義很不明確。
編輯2:結論:只有一個類可以知道它是否應該是可複製的以及如何去做。
Cloner cloner = new Cloner();
cloner.deepClone(object);
這看起來也很有趣,如果它能夠達到它的要求。我會看看這個圖書館,謝謝! – 2010-06-30 17:31:13
定義「FAITHFUL」,這不是一個藝術術語。 – 2010-06-30 16:40:33
你看過深色的圖書館嗎? http://robust-it.co.uk/clone/ – 2010-06-30 16:41:01
這通常是一個壞主意。我的意思是,你想要一個淺的副本還是一個深的副本?有多深?你的整個程序是否應該被複制?如果你沒有這個文件的副本,你怎麼知道它不是指你不應該複製的東西,或者有可能拋出的內部靜態引用?是否真的沒有其他可能的設計可以使用? – 2010-06-30 16:50:15