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

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

添加時克隆元素的Java列表

添加時克隆元素的Java列表

12345678_0001 2022-12-28 16:29:41
是否有實現 List 接口并在將元素添加到列表時克隆元素的 Java 類?這樣做的目的是將此列表封裝為一個對象。當然,我自己寫一個很容易,比如,將 ArrayList 包裝在另一個類中,然后在實現 add 和 get 方法時調用 clone 方法。但是,我想我會詢問 Java 是否已經提供了這樣一個類,并有可能為自己節省一些繁瑣的編碼。
查看完整描述

2 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

我懷疑是否存在,原因有幾個:

  1. 那應該如何列出克隆元素?Object.clone()僅適用于實現的類型@Cloneable;當它工作時,它只做一個淺拷貝(例如,如果對象有一個List字段,它會克隆對列表對象的引用,而不是它的元素);打敗它自己的目的。有關 Java 克隆問題的信息。因此,要使克隆真正起作用,可克隆類型需要Object.clone()使用適當的實現來覆蓋。這意味著您的“克隆列表”需要知道包含的類型clone()是否正確實現,即使它成功實現了,它也只對一組非常有限的類型有用。

  2. 對于實際實現 的類型,執行而不是clone()相當簡單。帶有第 1 點中提到的注意事項的全新類型的列表,只是為了讓我們免于輸入 8 個字符,這似乎不是一個非常有用的東西。list.add(elem.clone())list.add(elem)


查看完整回答
反對 回復 2022-12-28
?
達令說

TA貢獻1821條經驗 獲得超6個贊

沒有標準方法可以實現任何 Collection 在添加對象時自動克隆其對象。


如果你真的想要,你可以創建自己的 List 實現并使用反射來克隆每個進出的對象。當被問到這樣的問題時,我從不建議您實際在 Collections 庫中創建自己的實現。我認為在這種情況下實際創建您自己的實現的唯一原因是,如果您有一些其他庫將 List 或 Collection 作為參數,并且您真的不希望該 Collection 的值發生變化。


還有一個選項是不實際將可變數據存儲在列表中。您始終可以為要存儲在集合中的數據創建不可變的實現。如果可能的話,這是我會選擇的選項。如果你走這條路,你仍然必須確保數據元素是不可變的,或者List<ImmutableData>取而代之。使用List<ImmutableData>可能不是一個壞主意,但您可能必須List<? extends Data>在大多數方法簽名中使用。


它可能看起來像這樣:


interface Data {

    String getString();

    MutableData toMutable();

}

class MutableData implements Data {

    String getString() {...}

    void setString(String s) {...}

    Data toImmutable() {...}

    MutableData clone() {...}

}

class ImmutableData implements Data {...}

如果您仍然想要克隆,但不想使用反射或處理 Cloneable 接口帶來的所有問題,您可以創建自己的接口,該接口更適合您的應用程序。


查看完整回答
反對 回復 2022-12-28
  • 2 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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