似乎已经达成共识,即Java的克隆被破坏到尽可能永远不会被使用的程度。
我有一种情况,似乎就像克隆是正确的工具,但我想知道是否还有另一种方式:
我有一些存储在mongo数据库中的对象。它们使用Morphia进行保存和加载,Morphia会自动返回具有正确类和属性的对象。
在某些情况下,存储在数据库中的内容是我想要创建副本的对象的“原型”。它来自morphia,具有正确的类和默认值,我希望能够创建一个保留类和默认值的副本。 E.g:
achievementPrototype = morphia.get(id);
playerAchievements.add(achievementPrototype.clone());
其中achievementPrototype是一个类,它是AbstractAchievement的具体实现。看起来像克隆做我想要的。我知道如果成就有对象作为属性我将不得不实现他们的克隆,但我没关系。
我应该使用clone()吗?如果没有,我应该使用什么?
答案 0 :(得分:1)
它并没有被破坏,但它没有像大多数人想要的那样工作而不修改它。您的对象必须实现Cloneable,并且还要覆盖clone()方法以使其公开。我个人更喜欢这种替代品。
<强> BeanUtils的:强>
BeanUtils.cloneBean(objectToClone)将创建一个类似于使用Object.clone()创建的浅层克隆。
<强> SerializationUtils:强>
SerializationUtils.clone(objectToClone)将创建一个您可能正在寻找的深度克隆,但所有对象都必须实现Serializable。
答案 1 :(得分:0)
如果您只想创建可以随后保存并获取新ID的新对象,从而在数据库中复制,只需清除ID字段,当morphia再次保存这些对象时,它会认为它们是因为他们没有ID而且会为他们生成新的ID。