2013-10-22 74 views
1

似乎有一種共識,認爲Java的克隆被破壞的程度應該不會被使用,如果可能的話。創建原型副本,我應該使用克隆嗎?

我有一個情況是似乎像克隆是正確的工具,但我不知道是否有另一種方式:

我有多種存儲在數據庫蒙哥對象。它們使用Morphia保存和加載,它使用正確的類和屬性自動返回對象。

在某些情況下,存儲在數據庫中的是我想要創建副本的對象的「原型」。它來自morphia具有正確的類和默認值,我希望能夠創建一個保留類和默認值的副本。例如: -

achievementPrototype = morphia.get(id); playerAchievements.add(achievementPrototype.clone());

凡achievementPrototype是一類,這是一個具體實現的AbstractAchievement的。這看起來像克隆做我想要的。我知道,如果成就有物品屬性,我將不得不實施他們的克隆,但我沒有問題。

我應該使用clone()嗎?如果不是,我應該使用什麼?

+0

如果我理解正確的話,這似乎有點冒失。基本上你不知道編譯時的具體類,所以你正在利用clone()來創建新的實例? –

+0

相關:http://stackoverflow.com/q/2156120/1065197 –

回答

1

這並不是說它壞了,但它沒有按照最想要的方式工作,而沒有修改它。您的對象必須實現Cloneable,並且還要覆蓋clone()方法以使其公開。有一些我個人更喜歡的替代方案。

的BeanUtils:
BeanUtils.cloneBean(objectToClone)將創建一個淺克隆類似於將與Object.clone創建()。

SerializationUtils:
SerializationUtils.clone(objectToClone)將創建一個深克隆,你可能會尋找,但所有對象必須實現Serializable接口。

0

如果你只是想創建新的對象,可以隨後保存並獲得新的ID,因此是數據庫中的副本,只需清除ID字段,當morphia再次保存這些對象時,它會認爲他們'因爲他們沒有ID並且會爲他們生成新的ID,因此重新登錄。

+0

謝謝,但應用程序需要能夠創建單獨的實例,這些實例是原型的副本/克隆,無需從db中保存/加載每個實例。 – justkevin

+0

哦,所以你需要他們,不管孟戈和持久。我仍然避免克隆(),並只寫一個構造函數,它接受一個類的實例並複製這些值。 – evanchooly

相關問題