国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 作者談克隆方法的實現

gaomysion / 604人閱讀

摘要:不合規的代碼示例合規解決方案參閱復制構造函數與克隆也可以參閱應該實現克隆覆蓋的類應為并調用下面為引文翻譯談設計與作者的對話,作者首次在上發表,年月日復制構造函數與克隆在你的書中,你建議使用復制構造函數而不是實現和編寫。

今天在用 sonar 審核代碼, 偶然看到下面的提示:

關于這個的提示大意是:

“克隆”不應該被覆蓋, 屬壞味道, 阻斷型錯誤
約書亞?布洛赫表示,許多人在 Java 中對 clone 方法 和 Cloneable 接口存在誤解,很大程度上是因為重寫 clone 方法的規則很棘手, 且出錯難以糾正。
Object 的 clone 方法非常棘手。它基于屬性復制,而且是“超語言”。它創建一個對象而不調用構造函數。無法保證它保留構造函數創建的不變量。多年來,在 Sun 公司內外都存在許多錯誤,這源于這樣一個事實,即如果你只是反復調用 super.clone 直到克隆了一個對象,那么你就擁有了一個淺層的對象副本。克隆通常與正在克隆的對象共享狀態。如果該狀態是可變的,則您沒有兩個獨立的對象。如果您修改一個,另一個也會更改。突然之間,你會得到隨機行為。

所以, 應該使用復制構造函數或復制工廠。

clone 無論是否實現 Cloneable 接口,此規則在被覆蓋時都會引發問題。

不合規的代碼示例

public class MyClass {
  // ...

  public Object clone() { // Noncompliant
    //...
  }
}

合規解決方案

public class MyClass {
  // ...

  MyClass (MyClass source) {
    //...
  }
}

參閱
《復制構造函數與克隆》
也可以參閱

S2157 - “Cloneables”應該實現“克隆”
S1182 - 覆蓋“clone”的類應為“Cloneable”并調用“super.clone()”

下面為引文翻譯

Josh Bloch 談設計
與《Effective Java》作者的對話,Josh Bloch

作者 Bill Venners
首次在JavaWorld上發表,2002年1月4日

復制構造函數與克隆

Bill Venners: 在你的書中,你建議使用復制構造函數而不是實現Cloneable和編寫clone。你能詳細說明嗎?

Josh Bloch:如果你已經閱讀了我的書中關于克隆的章節,特別是如果你看得仔細的話,你就會知道我認為克隆已經完全壞掉的東西。有一些設計缺陷,其中最大的一個是 Cloneable 接口沒有 clone方法。這意味著它根本不起作用:實現了 Cloneable 接口并不說明你可以用它做什么。相反,它說明了內部可能做些什么。它說如果通過super.clone 反復調用它最終調用 Object 的 clone 方法,這個方法將返回原始的屬性副本。

但它沒有說明你可以用一個實現 Cloneable 接口的對象做什么,這意味著你不能做多態 clone 操作。如果我有一個 Cloneable 數組,你會認為我可以運行該數組并克隆每個元素以制作數組的深層副本,但不能。你不能強制轉換對象為 Cloneable 接口并調用 clone 方法,因為 Cloneable 沒有public clone 方法,Object 類也沒有。如果您嘗試強制轉換 Cloneable 并調用該 clone 方法,編譯器會說您正在嘗試在對象上調用受保護的clone方法。

事實的真相是,您不通過實施 Cloneable 和提供 clone 除復制能力之外的公共方法為您的客戶提供任何能力。如果您提供具有不同名稱的copy操作, 怎么也不次于去實現 Cloneable 接口。這基本上就是你用復制構造函數做的事情。復制構造方法有幾個優點,我在本書中有討論。一個很大的優點是可以使副本具有與原始副本不同的實現。例如,您可以將一個 LinkedList 復制到 ArrayList。

Object 的 clone 方法是非常棘手的。它基于屬性復制,而且是“超語言”。它創建一個對象而不調用構造函數。無法保證它保留構造函數建立的不變量。多年來,在Sun內外存在許多錯誤,這源于這樣一個事實,即如果你只是super.clone 反復調用鏈直到你克隆了一個對象,那么你就擁有了一個淺層的對象副本。克隆通常與正在克隆的對象共享狀態。如果該狀態是可變的,則您沒有兩個獨立的對象。如果您修改一個,另一個也會更改。突然之間,你會得到隨機行為。

我使用的東西很少實現 Cloneable。我經常提供實現類的 clone 公共方法,僅是因為人們期望有。我沒有抽象類實現 Cloneable,也沒有接口擴展它,因為我不會將實現的負擔 Cloneable 放在擴展(或實現)抽象類(或接口)的所有類上。這是一個真正的負擔,幾乎沒有什么好處。

Doug Lea 走得更遠。他告訴我 clone 除了復制數組之外他不再使用了。您應該使用 clone 復制數組,因為這通常是最快的方法。但 Doug 的類根本就不再實施 Cloneable了。他放棄了。而且我認為這并非不合理。

這是一個恥辱, Cloneable 接口壞掉了,但它發生了。最初的 Java API在緊迫的期限內完成,以滿足市場窗口收緊的需求。最初的 Java 團隊做了不可思議的工作,但并非所有的 API 都是完美的。 Cloneable 是一個弱點,我認為人們應該意識到它的局限性。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73848.html

相關文章

  • 給自己博客網站加上酷炫初音未來音樂游戲?

    摘要:嘻嘻大功告成計劃完美實現參考文獻樂柔嘴巴反向代理學習及實例筆記利用的反向代理克隆生成鏡像網站中間人攻擊原作者的原始游戲頁面上國人搬運的開源鏡像特別致謝執著的少年 先前在某個Q群里有位網友發了個鏈接,一點進去,發現是個極度讓人耳目一新的初音未來音樂網頁游戲。 為了讓有幸看到這篇文章的看官也來體會下本人第一次玩時的激動,拋個鏈接——樂柔嘴巴。鏈接的具體地址是blog.eunji.cn/m...

    caozhijian 評論0 收藏0
  • 給自己博客網站加上酷炫初音未來音樂游戲?

    摘要:嘻嘻大功告成計劃完美實現參考文獻樂柔嘴巴反向代理學習及實例筆記利用的反向代理克隆生成鏡像網站中間人攻擊原作者的原始游戲頁面上國人搬運的開源鏡像特別致謝執著的少年 先前在某個Q群里有位網友發了個鏈接,一點進去,發現是個極度讓人耳目一新的初音未來音樂網頁游戲。 為了讓有幸看到這篇文章的看官也來體會下本人第一次玩時的激動,拋個鏈接——樂柔嘴巴。鏈接的具體地址是blog.eunji.cn/m...

    qylost 評論0 收藏0
  • 給自己博客網站加上酷炫初音未來音樂游戲?

    摘要:嘻嘻大功告成計劃完美實現參考文獻樂柔嘴巴反向代理學習及實例筆記利用的反向代理克隆生成鏡像網站中間人攻擊原作者的原始游戲頁面上國人搬運的開源鏡像特別致謝執著的少年 先前在某個Q群里有位網友發了個鏈接,一點進去,發現是個極度讓人耳目一新的初音未來音樂網頁游戲。 為了讓有幸看到這篇文章的看官也來體會下本人第一次玩時的激動,拋個鏈接——樂柔嘴巴。鏈接的具體地址是blog.eunji.cn/m...

    booster 評論0 收藏0
  • 自動化測試工具

    摘要:自己寫一個程序來自動生成測試數據,因為每個個人作業的要求不一樣,自動化框架無法對每種程序都生成測試數據,目前只支持生成按規則生成隨機的字符串測試集。 作者:Grey...

    tuniutech 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<