亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于Java可克隆

關于Java可克隆

瀟瀟雨雨 2019-07-30 15:12:30
關于Java可克隆我正在尋找一些解釋Java的教程Cloneable,但沒有得到任何好的鏈接,而且Stack Overflow正變得越來越明顯。我想知道以下內容:Cloneable意味著我們可以通過實現Cloneable接口來獲得克隆或對象的副本。這樣做的優點和缺點是什么?如果對象是復合對象,遞歸克隆如何發生?
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

你應該知道的第一件事Cloneable是 - 不要使用它。

Cloneable正確的方法實現克隆是非常困難的,并且努力是不值得的。

而不是使用其他選項,如apache-commons SerializationUtils(深度克隆)或BeanUtils(淺層克?。蛘咧皇褂脧椭茦嬙旌瘮?。

請參閱此處了解Josh Bloch關于克隆的觀點Cloneable,這解釋了該方法的許多缺點。(Joshua Bloch是Sun的一名員工,領導了許多Java功能的開發。)


查看完整回答
反對 回復 2019-07-30
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

不幸的是,Cloneable本身只是一個標記接口,它是:它沒有定義clone()方法。

做的是改變受保護的Object.clone()方法的行為,該方法將為不實現Cloneable的類拋出CloneNotSupportedException,并為那些執行成員的類執行淺層復制。

即使這是您正在尋找的行為,您仍然需要實現自己的clone()方法才能將其公開。

在實現你自己的clone()時,我們的想法是從super.clone()創建的對象開始,它保證是正確的類,然后在淺副本不是什么的情況下再做任何其他字段。你要。從clone()調用構造函數會有問題,因為如果子類想要添加自己的附加可克隆邏輯,這會破壞繼承; 如果是調用super.clone(),在這種情況下會得到錯誤類的對象。

這種方法繞過了構造函數中可能定義的任何邏輯,這可能會產生問題。

另一個問題是,任何忘記覆蓋clone()的子類都會自動繼承默認的淺拷貝,這可能不是你想要的可變狀態(現在將在源和副本之間共享)。

大多數開發人員出于這些原因不使用Cloneable,而只是實現了一個復制構造函數。

有關Cloneable的更多信息和潛在缺陷,我強烈推薦Joshua Bloch撰寫的Effective Java一書


查看完整回答
反對 回復 2019-07-30
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

  1. 克隆調用一種超語言的構造對象的方式 - 沒有構造函數。

  2. 克隆要求您以某種方式處理CloneNotSupportedException - 或者打擾客戶端代碼來處理它。

  3. 好處很小 - 您不必手動編寫復制構造函數。

所以,明智地使用Cloneable。與您為完成所有事情所需的努力相比,它沒有給您足夠的好處。


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 340 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號