我聽說你應該在你的代碼中避免它,但它是由於某種原因實現的,所以有沒有一種情況是使用它實際上是一個好的(或不壞的)選擇,或者我應該總是試圖避免它?我應該在java中使用克隆方法嗎?
回答
Josh Bloch answered this perfectly:
如果你讀過關於我的書克隆的項目,特別是如果你 字裏行間,你會知道,我認爲克隆深感 破碎。有一些設計缺陷,其中最大的問題是Cloneable接口沒有克隆方法。這意味着它 根本不起作用:使可克隆的東西不會說什麼 關於你可以用它做什麼。相反,它說了一些關於它可以在內部做什麼的東西。它說如果通過反覆調用super.clone 它最終調用Object的克隆方法,該方法將返回原始字段副本 。
但是它沒有說明你可以用 實現Cloneable接口的對象做什麼,這意味着你不能做一個 多態克隆操作。如果我有一個Cloneable數組,你會認爲我可以運行該數組並克隆每個元素 以創建數組的深層副本,但是我不能。您不能將 轉換爲Cloneable並調用克隆方法,因爲Cloneable 沒有公共克隆方法,也沒有Object。如果您嘗試使用 將其轉換爲Cloneable並調用克隆方法,編譯器會說您嘗試調用對象上的受保護克隆方法的 。
Cloneable被破壞是一種遺憾,但它發生了。原始 Java API在緊迫的最後期限內完成得非常迅速,以滿足關閉市場窗口 。最初的Java團隊做了一件令人難以置信的工作,但並不是所有的API都是完美的。 Cloneable是一個弱點,我認爲人們應該意識到它的侷限性。
+1供參考 – 2014-10-26 22:15:41
您應該嘗試始終根據對象類型覆蓋克隆方法,但java clone()方法並不總是按照您的要求進行操作。
- 1. 在getter方法中,我應該克隆要返回的字符串嗎?
- 2. 使用多個克隆方法.. Java的
- 3. 創建原型副本,我應該使用克隆嗎?
- 4. 我應該使用ToList()深層克隆IList嗎?
- 5. 添加新元素時應該使用克隆嗎?什麼時候應該使用克隆?
- 6. jQuery克隆:它應該克隆DOM級別0事件嗎?
- 7. 克隆(true)應該在追加克隆的元素時使用,還是使用克隆(false)時使用()?
- 8. 我應該克隆node_modules中的節點庫來修改它嗎?
- 9. 從github克隆python包時,我應該克隆到哪裏?
- 10. 克隆方法
- 11. 我應該使用replace()方法嗎?
- 12. 我應該使用這種方法嗎?
- 13. 通用java覆蓋克隆方法
- 14. 我應該從git存儲庫克隆所有數據嗎?
- 15. GWT應用程序中使用的Javascript通用克隆()方法
- 16. Threejs克隆方法
- 17. Git的方法:在克隆
- 18. 覆蓋克隆方法 - 不工作(Java)
- 19. Java:關於克隆方法的問題
- 20. 的java:克隆方法違反
- 21. Java克隆方法如何工作?
- 22. 我應該在塊中使用「self」來訪問類方法嗎?
- 23. 我應該在方法名中使用「get」-prefix嗎?
- 24. 我應該在控制器中使用正常的方法嗎?
- 25. 我應該在後臺線程中使用異步方法嗎?
- 26. 我應該在LogOff方法中使用Session.Abandon()嗎?
- 27. java.util.Logger logp - 我應該在方法名中使用()嗎?
- 28. 我如何在Java中克隆異常
- 29. 克隆傳統Rails應用程序時,我應該限制寶石版本嗎?
- 30. 無法在Eclipse中啓動java應用程序後,mercurial克隆
我不會說你應該避免它。像幾乎所有東西一樣,你可以使用它的正確或錯誤...閱讀關於原型模式的東西,這就是你如何使用它的權利... – 2014-10-26 22:10:41
如果不確定,請自己實施,或者如果可能,最好檢查一下源代碼。使用clone()的坑洞主要在於你不能總是知道它是否按預期工作(除非你測試它,當然)。例如,我很難得到一個int數組的克隆。然而,克隆的文檔聲明它應該返回一個對象的副本,所以我也在等待這個答案! – 2014-10-26 22:11:08
17年來我從未使用過它,或者是「複製構造函數」。 – EJP 2014-10-26 22:16:13