2011-08-30 136 views
6

爲了製作對象的副本並訪問其數據,有什麼更好,爲什麼?克隆對象

1.創建一個新的對象,並要 克隆通過構造

HashSet<String> myClone = new HashSet<String>(data); 

2.克隆對象是數據初始化,並將其轉換爲你相信它的類型被

HashSet<String> myClone = (HashSet<String>) data.clone(); 
+2

可能的重複http://stackoverflow.com/questions/2356809/shallow-copy-of-a-map-in-java –

+2

@ Mansoor是正確的:複製構造函數絕對是要走的路。 – mre

+0

@mre:直接使用複製構造函數意味着新對象將是指定類型的對象,而不是其類型與正在複製的對象相匹配的對象。在某些情況下,這可能非常糟糕。在ToyotaPrius上調用車輛的複製構造函數將產生與車輛相關的屬性與複製的ToyotaPrius匹配的車輛,但原稿車輛中的任何Toyota-Prius特定信息將在副本中省略。這樣的語義有時可能是需要的,但通常會希望的是豐田汽車的特性與原件相匹配。 – supercat

回答

2

絕對使用複製構造函數 - clone()真的很破(至少大多數人都同意)。有關詳細信息,請參閱here

0

克隆不會複製數據,將其複製引用(Shallow copy)。所以,如果你想做一個深層次的「複製」並且它與第一個獨立,你就必須做一個「逐項克隆」,通常被認爲是deep copy(有幾種方法可以實現這一點)。

此外,您可以看看實現該HashSet的類的clone()方法。如果該類已覆蓋該方法,則可能會執行深層複製。我推薦你這本書:http://www.horstmann.com/corejava.html

1

'這取決於'。並不是所有的類都有拷貝構造函數。某些類定義clone(),其他類從Object繼承。

如果您正在考慮如何在您自己的課程中實現複製語義,許多人建議不要克隆,但其他人建議使用它。第三種選擇是工作的靜態工廠方法。

如果您試圖製作某個現有類的副本,那麼您將受制於現有實現。也許它有一個clone()做你想做的事,也許它沒有。也許它有一個複製構造函數,也許它沒有。