3 回答

TA貢獻1776條經(jīng)驗 獲得超12個贊
你應(yīng)該知道的第一件事Cloneable
是 - 不要使用它。
用Cloneable
正確的方法實現(xiàn)克隆是非常困難的,并且努力是不值得的。
而不是使用其他選項,如apache-commons SerializationUtils
(深度克?。┗?a >BeanUtils
(淺層克?。蛘咧皇褂脧?fù)制構(gòu)造函數(shù)。
請參閱此處了解Josh Bloch關(guān)于克隆的觀點Cloneable
,這解釋了該方法的許多缺點。(Joshua Bloch是Sun的一名員工,領(lǐng)導(dǎo)了許多Java功能的開發(fā)。)

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

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