创建原型的副本,我应该使用克隆吗?

时间:2013-10-22 16:39:21

标签: java mongodb clone

似乎已经达成共识,即Java的克隆被破坏到尽可能永远不会被使用的程度。

我有一种情况,似乎就像克隆是正确的工具,但我想知道是否还有另一种方式:

我有一些存储在mongo数据库中的对象。它们使用Morphia进行保存和加载,Morphia会自动返回具有正确类和属性的对象。

在某些情况下,存储在数据库中的内容是我想要创建副本的对象的“原型”。它来自morphia,具有正确的类和默认值,我希望能够创建一个保留类和默认值的副本。 E.g:

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

其中achievementPrototype是一个类,它是AbstractAchievement的具体实现。看起来像克隆做我想要的。我知道如果成就有对象作为属性我将不得不实现他们的克隆,但我没关系。

我应该使用clone()吗?如果没有,我应该使用什么?

2 个答案:

答案 0 :(得分:1)

它并没有被破坏,但它没有像大多数人想要的那样工作而不修改它。您的对象必须实现Cloneable,并且还要覆盖clone()方法以使其公开。我个人更喜欢这种替代品。

<强> BeanUtils的:
BeanUtils.cloneBean(objectToClone)将创建一个类似于使用Object.clone()创建的浅层克隆。

<强> SerializationUtils:
SerializationUtils.clone(objectToClone)将创建一个您可能正在寻找的深度克隆,但所有对象都必须实现Serializable。

答案 1 :(得分:0)

如果您只想创建可以随后保存并获取新ID的新对象,从而在数据库中复制,只需清除ID字段,当morphia再次保存这些对象时,它会认为它们是因为他们没有ID而且会为他们生成新的ID。

相关问题