2 回答
TA貢獻1804條經驗 獲得超7個贊
我懷疑是否存在,原因有幾個:
那應該如何列出克隆元素?
Object.clone()僅適用于實現的類型@Cloneable;當它工作時,它只做一個淺拷貝(例如,如果對象有一個List字段,它會克隆對列表對象的引用,而不是它的元素);打敗它自己的目的。有關 Java 克隆問題的信息。因此,要使克隆真正起作用,可克隆類型需要Object.clone()使用適當的實現來覆蓋。這意味著您的“克隆列表”需要知道包含的類型clone()是否正確實現,即使它成功實現了,它也只對一組非常有限的類型有用。對于實際實現 的類型,執行而不是
clone()相當簡單。帶有第 1 點中提到的注意事項的全新類型的列表,只是為了讓我們免于輸入 8 個字符,這似乎不是一個非常有用的東西。list.add(elem.clone())list.add(elem)
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 接口帶來的所有問題,您可以創建自己的接口,該接口更適合您的應用程序。
添加回答
舉報
