當在網絡中搜索多種可能性時如何製作對象的深層副本時,我發現solution聲稱可以解決許多問題,例如,clone()
方法不可能克隆final
字段。該解決方案結合使用clone()
裏面執行受保護的拷貝構造函數,基本上是這樣的(例如,從引用的頁面複製):使用新的關鍵字和複製構造函數代替super.clone的Java克隆()方法
public class Person implements Cloneable
{
private final Brain brain; // brain is final since I do not want
// any transplant on it once created!
private int age;
public Person(Brain aBrain, int theAge)
{
brain = aBrain;
age = theAge;
}
protected Person(Person another)
{
Brain refBrain = null;
try
{
refBrain = (Brain) another.brain.clone();
// You can set the brain in the constructor
}
catch(CloneNotSupportedException e) {}
brain = refBrain;
age = another.age;
}
public Object clone()
{
return new Person(this);
}
…
}
的Brain
的clone()
方法可以以類似的方式來實現。
基於documentation of the clone()
method,似乎這個方法的所有「契約」不是絕對的要求,而且「返回的對象應該通過調用super.clone()
獲得」僅僅是一個約定。
那麼,這個實現實際上是不正確的?爲什麼?
如果它是正確的,爲什麼它沒有成爲設計模式?這有什麼缺點?
感謝,切赫
我不明白爲什麼不簡單地使用「新人(this.brain,this.age)」(如果屬性是最終的)或「新人(this.brain.clone(),this.age)在其他case –
clone()'已經足夠的了,你應該只是在任何地方使用拷貝構造函數,並且完全停止編寫'clone'方法 –
我從來沒有理解過爲什麼你需要它們,你需要在C++中拷貝構造函數,因爲編譯器生成調用有時甚至需要自己編寫它們,最終這是因爲默認的C++參數語義是object-by的值,但在近16年的Java中,我從未使用clone()或copy構造函數任何嚴肅的代碼 – EJP