1

似乎有一种共识,即 Java 的克隆已被破坏到尽可能不使用它的程度。

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

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

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

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

成就原型是一个抽象成就的具体实现的类。似乎克隆做了我想要的。我知道如果成就将对象作为属性,我将不得不实现它们的克隆,但我可以接受。

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

4

2 回答 2

1

并不是说它坏了,但是如果不对其进行修改,它就不能按照大多数人想要的方式工作。您的对象必须实现 Cloneable 并覆盖 clone() 方法才能使其公开。我个人更喜欢一些替代方案。

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

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

于 2013-10-22T16:56:14.723 回答
0

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

于 2013-10-22T17:16:21.230 回答