2014-10-26 60 views
3

我聽說你應該在你的代碼中避免它,但它是由於某種原因實現的,所以有沒有一種情況是使用它實際上是一個好的(或不壞的)選擇,或者我應該總是試圖避免它?我應該在java中使用克隆方法嗎?

+0

我不會說你應該避免它。像幾乎所有東西一樣,你可以使用它的正確或錯誤...閱讀關於原型模式的東西,這就是你如何使用它的權利... – 2014-10-26 22:10:41

+0

如果不確定,請自己實施,或者如果可能,最好檢查一下源代碼。使用clone()的坑洞主要在於你不能總是知道它是否按預期工作(除非你測試它,當然)。例如,我很難得到一個int數組的克隆。然而,克隆的文檔聲明它應該返回一個對象的副本,所以我也在等待這個答案! – 2014-10-26 22:11:08

+2

17年來我從未使用過它,或者是「複製構造函數」。 – EJP 2014-10-26 22:16:13

回答

3

Josh Bloch answered this perfectly:

如果你讀過關於我的書克隆的項目,特別是如果你 字裏行間,你會知道,我認爲克隆深感 破碎。有一些設計缺陷,其中最大的問題是Cloneable接口沒有克隆方法。這意味着它 根本不起作用:使可克隆的東西不會說什麼 關於你可以用它做什麼。相反,它說了一些關於它可以在內部做什麼的東西。它說如果通過反覆調用super.clone 它最終調用Object的克隆方法,該方法將返回原始字段副本 。

但是它沒有說明你可以用 實現Cloneable接口的對象做什麼,這意味着你不能做一個 多態克隆操作。如果我有一個Cloneable數組,你會認爲我可以運行該數組並克隆每個元素 以創建數組的深層副本,但是我不能。您不能將 轉換爲Cloneable並調用克隆方法,因爲Cloneable 沒有公共克隆方法,也沒有Object。如果您嘗試使用 將其轉換爲Cloneable並調用克隆方法,編譯器會說您嘗試調用對象上的受保護克隆方法的 。

Cloneable被破壞是一種遺憾,但它發生了。原始 Java API在緊迫的最後期限內完成得非常迅速,以滿足關閉市場窗口 。最初的Java團隊做了一件令人難以置信的工作,但並不是所有的API都是完美的。 Cloneable是一個弱點,我認爲人們應該意識到它的侷限性。

+0

+1供參考 – 2014-10-26 22:15:41

相關問題