2013-10-22 55 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

相关问题