2011-09-14 32 views
4

如果某個類不是Cloneable,則不能克隆該類的任何對象。那麼爲什麼clone()保存在Object類而不是在Cloneable界面?爲什麼clone()方法保存在Object中?

+0

這可能會離開,但它可能是某種形式的多態性,例如,在一個集合中foreach'Object',試着克隆它,如果成功做了一件事情,如果拋出一個異常做另一件事。 –

+0

[Java:Cloneable接口的基本原理]的可能重複(http://stackoverflow.com/questions/709380/java-rationale-of-the-cloneable-interface) –

+0

閱讀答案[here](http:// stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in-java-lang-object)或[這裏](http://stackoverflow.com/questions/709380/java-rationale-of -the-cloneable-interface)應該可以幫到你。 –

回答

0
  1. Cloneable是一個標記接口,作爲用戶/開發人員的屬性來查看該類是否爲clonebale。因爲在你的clone()實現中,建議你調用super的clone(),這隻有在超類具有一個克隆函數(即使它沒有標記爲clone)時纔會發生(())(clone通過實現Cloneable),因此保持Object中的clone()函數是有意義的。如果構造函數應該調用super的方法來創建一個完整的實例,clone()會創建一個完全不同的類實例。

+0

第2點是錯誤的:類可以*總是*調用'super.clone()',因爲'Object'具有'clone()'。第3點在這裏是不相關的,我沒有看到它是如何將'clone()'保存在'object'中的原因。 –

+0

點2表示,克隆保存在Object中,以便它的任何子類(通過調用super.clone())都可以調用它,即使它沒有標記爲可複製。 點3的相關性是,當我們調用super的構造函數來創建一個實例時,我們也必須對它進行克隆。不是強制性的但強烈建議。 – Satyavrat

2

這是Java的設計錯誤(是的,Java並不完美!)。

最好避免在Java中克隆。例如喬希布洛赫指出了有效的Java,項目11:

Cloneable接口的目的是作爲一個混合接口(項18) 爲對象,以通告它們允許克隆。不幸的是,它 未能達到此目的。它的主要缺陷是缺少克隆方法,並且Object的克隆方法受到保護。如果沒有 (如果沒有 ),則僅僅因爲它實現了Cloneable而無法調用 對象上的克隆方法。即使反射 調用也可能失敗,因爲不能保證該對象具有可訪問的克隆方法 。儘管存在這個缺陷和其他問題,但該設施的廣泛使用範圍爲 ,因此理解它是值得的。

如果您希望您的對象是可複製的,請實現複製構造函數或複製方法。

相關問題