3 回答

TA貢獻1776條經驗 獲得超12個贊
你應該知道的第一件事Cloneable
是 - 不要使用它。
用Cloneable
正確的方法實現克隆是非常困難的,并且努力是不值得的。
而不是使用其他選項,如apache-commons SerializationUtils
(深度克隆)或BeanUtils
(淺層克?。蛘咧皇褂脧椭茦嬙旌瘮?。
請參閱此處了解Josh Bloch關于克隆的觀點Cloneable
,這解釋了該方法的許多缺點。(Joshua Bloch是Sun的一名員工,領導了許多Java功能的開發。)

TA貢獻2003條經驗 獲得超2個贊
不幸的是,Cloneable本身只是一個標記接口,它是:它沒有定義clone()方法。
做的是改變受保護的Object.clone()方法的行為,該方法將為不實現Cloneable的類拋出CloneNotSupportedException,并為那些執行成員的類執行淺層復制。
即使這是您正在尋找的行為,您仍然需要實現自己的clone()方法才能將其公開。
在實現你自己的clone()時,我們的想法是從super.clone()創建的對象開始,它保證是正確的類,然后在淺副本不是什么的情況下再做任何其他字段。你要。從clone()調用構造函數會有問題,因為如果子類想要添加自己的附加可克隆邏輯,這會破壞繼承; 如果是調用super.clone(),在這種情況下會得到錯誤類的對象。
這種方法繞過了構造函數中可能定義的任何邏輯,這可能會產生問題。
另一個問題是,任何忘記覆蓋clone()的子類都會自動繼承默認的淺拷貝,這可能不是你想要的可變狀態(現在將在源和副本之間共享)。
大多數開發人員出于這些原因不使用Cloneable,而只是實現了一個復制構造函數。
有關Cloneable的更多信息和潛在缺陷,我強烈推薦Joshua Bloch撰寫的Effective Java一書

TA貢獻1783條經驗 獲得超4個贊
克隆調用一種超語言的構造對象的方式 - 沒有構造函數。
克隆要求您以某種方式處理CloneNotSupportedException - 或者打擾客戶端代碼來處理它。
好處很小 - 您不必手動編寫復制構造函數。
所以,明智地使用Cloneable。與您為完成所有事情所需的努力相比,它沒有給您足夠的好處。
添加回答
舉報