亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java 作者談克隆方法的實現(xiàn)

gaomysion / 703人閱讀

摘要:不合規(guī)的代碼示例合規(guī)解決方案參閱復(fù)制構(gòu)造函數(shù)與克隆也可以參閱應(yīng)該實現(xiàn)克隆覆蓋的類應(yīng)為并調(diào)用下面為引文翻譯談設(shè)計與作者的對話,作者首次在上發(fā)表,年月日復(fù)制構(gòu)造函數(shù)與克隆在你的書中,你建議使用復(fù)制構(gòu)造函數(shù)而不是實現(xiàn)和編寫。

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

關(guān)于這個的提示大意是:

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

所以, 應(yīng)該使用復(fù)制構(gòu)造函數(shù)或復(fù)制工廠。

clone 無論是否實現(xiàn) Cloneable 接口,此規(guī)則在被覆蓋時都會引發(fā)問題。

不合規(guī)的代碼示例

public class MyClass {
  // ...

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

合規(guī)解決方案

public class MyClass {
  // ...

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

參閱
《復(fù)制構(gòu)造函數(shù)與克隆》
也可以參閱

S2157 - “Cloneables”應(yīng)該實現(xiàn)“克隆”
S1182 - 覆蓋“clone”的類應(yīng)為“Cloneable”并調(diào)用“super.clone()”

下面為引文翻譯

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

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

復(fù)制構(gòu)造函數(shù)與克隆

Bill Venners: 在你的書中,你建議使用復(fù)制構(gòu)造函數(shù)而不是實現(xiàn)Cloneable和編寫clone。你能詳細說明嗎?

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

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

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

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

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73848.html

相關(guān)文章

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

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

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

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

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

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

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

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

    tuniutech 評論0 收藏0

發(fā)表評論

0條評論

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