2010-02-21 135 views
4

我從來沒有見過clone()方法在任何實際代碼中使用。我正在讀它,並覺得它的使用可能會使代碼非常繁瑣。 是否有clone()方法的任何特定用例?在什麼情況下必須使用clone()以及爲什麼使用普通的析構函數還不夠?用例克隆()

回答

2

Josh Bloch在Effective Java中也不建議使用clone()方法。

有幾個問題用這種方法:

1)如果可複製的對象不僅有原始類型的字段,而且對象字段,然後克隆的對象將收到對這些對象的引用剛纔而不是真正的克隆對象。爲了避免這種情況,所有內部對象都應該可以複製。 2)如果你創建了一個可複製類的子類,那麼它也是可複製的(即使你不想要)。這就是爲什麼你應該以適當的方式重寫clone()方法以避免可能的問題。

當你應該使用它:從不,如果可能的話。你應該非常小心地使用它。如果您想要使可複製的對象中的所有字段都是原始類型,那麼這並不危險。在所有其他情況下,在使用前請三思。

+0

嗯...這是我正在閱讀的書..關於該方法的一切看起來很髒...想知道爲什麼它存在於所有 – Aadith 2010-02-21 15:34:57

+2

Java的第一個版本發佈相當快。他們做了很棒的工作,他們的許多決定都非常聰明。但他們也犯了一些錯誤,比如java.util.Date類或clone()方法。如果它被添加到API一次,他們不能改變它。 – Roman 2010-02-21 15:39:17

+0

@Roman java.util.Date怎麼樣?爲什麼這是一個錯誤? – Aadith 2010-02-21 15:59:31

3

clone是使傳遞給方法或構造陣列的防禦性拷貝很方便(如所有數組類型是Cloneable,並且被協變clone()簽名以便boolean[].clone()實際上返回一個boolean[]而非Object)。這是我見過的十年中唯一真正好用的,儘管...