我必須克隆沒有實現Cloneable接口的對象如何執行此操作。如何創建未實現Cloneable的對象的克隆
其實在我的項目中我使用的是JCChart。現在我的課程擴展了MultiChart,並且我必須讓我的課程得到深層次的複製。我能夠克隆我的類對象,但如何克隆MultiChart的對象。像我也必須克隆對象的傳說,對象的頁腳,對象的標題。
我必須克隆沒有實現Cloneable接口的對象如何執行此操作。如何創建未實現Cloneable的對象的克隆
其實在我的項目中我使用的是JCChart。現在我的課程擴展了MultiChart,並且我必須讓我的課程得到深層次的複製。我能夠克隆我的類對象,但如何克隆MultiChart的對象。像我也必須克隆對象的傳說,對象的頁腳,對象的標題。
如果你的班級是Serializable
比你可以serialize the object to ByteStream和Deserialize that stream to a new object。
我嘗試這個,但給出異常 java.io.IOException:未能加載圖像內容 我認爲writeObject無法寫入數據 –
@ user571616,如果您的objectmap中的任何類不是serialzable,它會拋出java.io.NotSerializableException異常。 (即,如果您的類A包含類B的對象& C;而A類實現Serializable&B不會,而序列化類A的對象將拋出此異常 - 說classB不可序列化) –
那麼,一種替代方法是提供一個拷貝構造函數,老實說,鑑於Java的克隆實現的超常語言性質,我傾向於選擇這個選項。
複製構造函數由一個構造函數組成,該構造函數接收單一參數的另一個相同類型的實例。然後你逐場去做相應的複製。
當你做這種事情時,你必須考慮到不變性以避免問題。
另一種方法是序列化你的對象,然後反序列化它,但這意味着你需要實現Serializable,這並不總是一個選項,它不是沒有任何影響。
複雜實例的過多手動工作圖表。序列化非常容易。可串行化接口僅用於默認序列化。還有其他可用的。 –
如果在編譯時類類型未知,則複製構造函數不起作用。即,您不能使用複製構造函數來動態克隆對象。 –
您寫道:
我要克隆的對象,沒有實現
Cloneable
界面如何做到這一點。
的克隆工作的要求是類提供了一個clone()
方法是可見在你要調用它的上下文。該類不have to
實施Cloneable
。它可以實現clone()
方法來顯式使用new
,然後通過構造函數和setter調用來初始化新對象。 (該Cloneable
接口是一個「標誌」的界面,使由java.lang.Object.clone()
方法實現的默認淺克隆機構)
在克隆的主題不使用克隆,替代方案包括:
這些方法都有侷限性;例如適當的構造函數,getter,setter或可串行化的可用性。使用前兩種方法實現深度克隆可能非常密集。最後一種方法的成本往往要昂貴得多,但它是向您提供複雜數據結構的深層副本的最簡單方法......如果這是您需要的。
...但我在applet中這樣做,所以無法序列化對象,因爲applet限制訪問文件系統。
Java對象串行(使用ObjectOutputStream
和ObjectInputStream
)和XStream既可以寫入對象由內存緩衝器備份流;例如ByteArrayOutputStream
。這避免了訪問文件系統的需要......並且速度會更快。
當我使用ByteArrayOutputStream來進行序列化,那麼在那個時候,它會給出下面的java.io.IOException:加載圖像內容失敗 我認爲圖像在序列化時沒有加載,所以我應該怎麼做 –
看看你是否可以使用[XStream](http://xstream.codehaus.org/)做你想做的事情。 –
但我在applet中這樣做,所以無法序列化對象,因爲applet限制訪問文件系統 –
使您的對象實現Cloneable接口並實現自己的深層副本。 – Heisenbug