2013-05-02 75 views
8

我一直在尋找有關java克隆的在線教程,但只發現克隆()的缺點,而且沒有任何優勢。我想知道使用Java clone()的一些優點。Java克隆的優點

回答

10

克隆當然有它的用途。想象一下,任何一種商業應用程序,其中包含以對象表示的數據記錄,您可以「另存爲」(複製和重命名)。如果該數據保存在實現Cloneable接口的對象中,則可以克隆原始數據並使用新信息進行更新。

這優於創建新的對象實例並明確複製所有數據。有些人用輔助類和複製方法解決了這個問題,但是你有需要的信息來複制班級本身之外的類,這是很糟糕的面向對象編程。

另一種使用情況下,我喜歡的是,當我使用一個類來作爲後備存儲用於GUI和GUI有一個復位按鈕。當GUI初始化時,我克隆後備存儲對象。然後,如果用戶按下恢復,我只是將GUI重新初始化爲克隆對象中的值,而不是計算它們可能已更改的信息,或從存儲中獲取原始信息的新副本。當然有很多用途。

但你也知道克隆可以在繼承框架和雜波起來,否則輕量級的數據類提出問題,所以除非有它一個業務需求,我不會讓一個對象可複製的。

3

我想你很難找到關於克隆的優勢,任何事物的原因是,其優點是隱:具有(據說)輕鬆地創建原始對象完全相同的副本。

但不幸的是,Java的內置克隆通過克隆機制()和Cloneable的有太多的缺點考慮,大多與可怕的影響有你的類的設計。 Josh Bloch有一整段關於爲什麼你不應該在他的書Effective Java中使用clone()或Cloneable,簡要總結爲interview

一般建議使用,而不是使用的clone()或Cloneable的拷貝構造函數,但你還是要決定一個淺或深拷貝是否恰當。您還可以使用序列化API(如Serializable或JAXB)以及各種克隆庫來創建深度克隆。你可以在相關的問題中找到一個很好的討論,Java: recommended solution for deep cloning/copying an instance

0

Object.clone()有許多設計問題,但它仍然是複製對象的流行和最簡單的方法。使用克隆()的一些優點是

  • 這是實現克隆即使年代久遠的項目,你只需要定義一個父類,它實現Cloneable,提供克隆的定義,最簡單的方法()方法,並且您已準備好您父母的每個孩子都將獲得克隆功能。
  • 如果不需要深度複製,克隆只需要很少的代碼,只需要一個帶有4或5行長克隆()方法的抽象類。
  • 克隆是複製數組的最快方法。
  • 作爲釋放1.5的,調用一個陣列上克隆返回一個數組,其編譯時間類型是相同被克隆這顯然意味着調用陣列克隆不需要型鑄造的陣列構成。

你可以閱讀更多的Java Cloning - Copy Constructor versus Cloning