2011-05-14 29 views
1

我必須克隆沒有實現Cloneable接口的對象如何執行此操作。如何創建未實現Cloneable的對象的克隆

其實在我的項目中我使用的是JCChart。現在我的課程擴展了MultiChart,並且我必須讓我的課程得到深層次的複製。我能夠克隆我的類對象,但如何克隆MultiChart的對象。像我也必須克隆對象的傳說,對象的頁腳,對象的標題。

+0

看看你是否可以使用[XStream](http://xstream.codehaus.org/)做你想做的事情。 –

+0

但我在applet中這樣做,所以無法序列化對象,因爲applet限制訪問文件系統 –

+0

使您的對象實現Cloneable接口並實現自己的深層副本。 – Heisenbug

回答

4

如果你的班級是Serializable比你可以serialize the object to ByteStreamDeserialize that stream to a new object

+0

我嘗試這個,但給出異常 java.io.IOException:未能加載圖像內容 我認爲writeObject無法寫入數據 –

+0

@ user571616,如果您的objectmap中的任何類不是serialzable,它會拋出java.io.NotSerializableException異常。 (即,如果您的類A包含類B的對象& C;而A類實現Serializable&B不會,而序列化類A的對象將拋出此異常 - 說classB不可序列化) –

0

那麼,一種替代方法是提供一個拷貝構造函數,老實說,鑑於Java的克隆實現的超常語言性質,我傾向於選擇這個選項。

複製構造函數由一個構造函數組成,該構造函數接收單一參數的另一個相同類型的實例。然後你逐場去做相應的複製。

當你做這種事情時,你必須考慮到不變性以避免問題。

另一種方法是序列化你的對象,然後反序列化它,但這意味着你需要實現Serializable,這並不總是一個選項,它不是沒有任何影響。

+0

複雜實例的過多手動工作圖表。序列化非常容易。可串行化接口僅用於默認序列化。還有其他可用的。 –

+0

如果在編譯時類類型未知,則複製構造函數不起作用。即,您不能使用複製構造函數來動態克隆對象。 –

2

您寫道:

我要克隆的對象,沒有實現Cloneable界面如何做到這一點。

的克隆工作的要求是類提供了一個clone()方法是可見在你要調用它的上下文。該類不have to實施Cloneable。它可以實現clone()方法來顯式使用new,然後通過構造函數和setter調用來初始化新對象。 (該Cloneable接口是一個「標誌」的界面,使由java.lang.Object.clone()方法實現的默認淺克隆機構)


在克隆的主題不使用克隆,替代方案包括:

  • 使用一個拷貝構造函數,
  • 使用一個常規的構造函數和一系列的getter和setter調用,或者通過對對象進行序列化和反序列化來調用

這些方法都有侷限性;例如適當的構造函數,getter,setter或可串行化的可用性。使用前兩種方法實現深度克隆可能非常密集。最後一種方法的成本往往要昂貴得多,但它是向您提供複雜數據結構的深層副本的最簡單方法......如果這是您需要的。

...但我在applet中這樣做,所以無法序列化對象,因爲applet限制訪問文件系統。

Java對象串行(使用ObjectOutputStreamObjectInputStream)和XStream既可以寫入對象由內存緩衝器備份流;例如ByteArrayOutputStream。這避免了訪問文件系統的需要......並且速度會更快。

+0

當我使用ByteArrayOutputStream來進行序列化,那麼在那個時候,它會給出下面的java.io.IOException:加載圖像內容失敗 我認爲圖像在序列化時沒有加載,所以我應該怎麼做 –