我聽說你應該在你的代碼中避免它,但它是由於某種原因實現的,所以有沒有一種情況是使用它實際上是一個好的(或不壞的)選擇,或者我應該總是試圖避免它?我應該在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. 添加新元素時應該使用克隆嗎?什麼時候應該使用克隆?
- 3. jQuery克隆:它應該克隆DOM級別0事件嗎?
- 4. 從github克隆python包時,我應該克隆到哪裏?
- 5. 通用java覆蓋克隆方法
- 6. 我應該使用這種方法嗎?
- 7. 我應該使用replace()方法嗎?
- 8. 我應該從git存儲庫克隆所有數據嗎?
- 9. Threejs克隆方法
- 10. Java:關於克隆方法的問題
- 11. 我應該在後臺線程中使用異步方法嗎?
- 12. 我應該在方法名中使用「get」-prefix嗎?
- 13. 我應該在LogOff方法中使用Session.Abandon()嗎?
- 14. 我應該在控制器中使用正常的方法嗎?
- 15. 無法在Eclipse中啓動java應用程序後,mercurial克隆
- 16. 克隆傳統Rails應用程序時,我應該限制寶石版本嗎?
- 17. 在Java中克隆列表
- 18. 克隆方法在C#(或在Java中)在內部使用new運算符?
- 19. java中的克隆()
- 20. 如何使用clone()方法克隆Java對象
- 21. 在這種情況下,方法克隆會起作用嗎?
- 22. 我應該評論Java中的@Override方法嗎?
- 23. 我可以在Java中動態調用該方法嗎?
- 24. 克隆Java NamingEnumeration?
- 25. 應該使用getInnerHtml()方法嗎?
- 26. 我應該在Perl中使用autobox嗎?
- 27. 我應該在IntentService中使用WakeLock嗎?
- 28. 如何在java中進行淺層克隆和深度克隆?
- 29. 如何使用http來克隆克隆?
- 30. 代碼克隆是C,Java和Python中的常見做法嗎?
我不會說你應該避免它。像幾乎所有東西一樣,你可以使用它的正確或錯誤...閱讀關於原型模式的東西,這就是你如何使用它的權利... – 2014-10-26 22:10:41
如果不確定,請自己實施,或者如果可能,最好檢查一下源代碼。使用clone()的坑洞主要在於你不能總是知道它是否按預期工作(除非你測試它,當然)。例如,我很難得到一個int數組的克隆。然而,克隆的文檔聲明它應該返回一個對象的副本,所以我也在等待這個答案! – 2014-10-26 22:11:08
17年來我從未使用過它,或者是「複製構造函數」。 – EJP 2014-10-26 22:16:13