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

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

如何正確覆蓋克隆方法?

如何正確覆蓋克隆方法?

長風秋雁 2019-07-06 16:20:15
如何正確覆蓋克隆方法?我需要在沒有超類的對象中實現深度克隆。處理檢查結果的最佳方法是什么?CloneNotSupportedException由超類引發的Object)?一位同事建議我以下方式處理這件事:@Overridepublic MyObject clone(){     MyObject foo;     try     {         foo = (MyObject) super.clone();     }     catch (CloneNotSupportedException e)     {         throw new Error();     }     // Deep clone member fields here     return foo;}對我來說,這似乎是一個很好的解決方案,但我想把它扔給StackOverflow社區,看看是否還有其他我可以包含的見解。謝謝!
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

你一定要用clone?大多數人都認為Java的clone都壞了。

喬希·布洛赫談設計復制構造器與克隆

如果你讀過我書中關于克隆的文章,尤其是你讀過的話,你就會知道我認為clone是深深的破碎。[.]很遺憾Cloneable是壞的,但它會發生。

你可以在他的書中讀到關于這個主題的更多討論。有效Java第2版,第11項:覆蓋clone明智地..他建議使用復制構造函數或復制工廠。

他接著寫了幾頁,如果你覺得必須的話,你應該如何實現。clone..但他最后說:

這些復雜的事情真的有必要嗎?很少。如果擴展實現Cloneable,您別無選擇,只能實現一個良好的行為。clone方法。否則,您最好提供另一種對象復制方法,或者干脆不提供此功能。.

重點是他的,不是我的。


因為你清楚地表明你別無選擇,只能實現clone,在這種情況下,您可以這樣做:確保MyObject extends java.lang.Object implements java.lang.Cloneable..如果是這樣的話,你可以保證絕不可能抓到CloneNotSupportedException..投擲AssertionError正如一些人所建議的,似乎是合理的,但您也可以添加一個注釋,解釋為什么永遠不會輸入CATCH塊。在這種情況下.


或者,正如其他人所建議的,您也許可以實現clone不打電話super.clone.


查看完整回答
反對 回復 2019-07-06
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

有兩種情況CloneNotSupportedException將被拋出:

  1. 要克隆的類沒有實現。

    Cloneable

    (假設實際的克隆最終符合

    Object

    如果要在實現中編寫此方法的類

    Cloneable

    ,這種情況永遠不會發生(因為任何子類都會適當地繼承它)。
  2. 異常由實現顯式拋出這是在超類為

    Cloneable.

后一種情況不能發生在您的類中(因為您正在直接調用try塊,即使從子類調用super.clone())而前者不應該因為你的課清楚地應該實現Cloneable.

基本上,您應該確定地記錄錯誤,但是在這個特定的例子中,只有當您弄糟了類的定義時,它才會發生。因此,將其視為NullPointerException(或類似的)-如果您的代碼是功能性的,就永遠不會拋出它。


在其他情況下,您需要為這種情況做好準備-不能保證給定的對象可克隆,因此當捕獲異常時,應根據此條件采取適當的操作(繼續使用現有對象,采取替代的克隆策略,例如序列化反序列化,拋出IllegalParameterException如果您的方法需要可克隆的參數,等等)。

編輯:雖然總的來說,我應該指出,是的,clone()確實很難正確地實現,調用者也很難知道返回值是否會是他們想要的,當您考慮深的和淺的克隆時,更是如此。通常情況下,最好是完全避免整件事,并使用另一種機制。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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