java - 创建原型(prototype)的副本,我应该使用克隆吗?

标签 java mongodb clone

似乎有一个共识,即 Java 的克隆已经被破坏到了如果可能的话永远不应该使用的程度。

我遇到的情况是克隆似乎是正确的工具,但我想知道是否还有其他方法:

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

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

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

其中 AchievementPrototype 属于 AbstractAchievement 的具体实现类。看来克隆做了我想要的事情。我知道如果成就有对象作为属性,我就必须实现它们的克隆,但我对此表示同意。

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

最佳答案

并不是说它坏了,而是在不修改它的情况下它无法按照大多数人想要的方式工作。您的对象必须实现 Cloneable 并重写 clone() 方法才能将其公开。有一些我个人更喜欢的替代方案。

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

序列化实用程序:
SerializationUtils.clone(objectToClone)将创建一个深度克隆,您可能正在寻找它,但所有对象都必须实现可序列化。

关于java - 创建原型(prototype)的副本,我应该使用克隆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19523593/

相关文章:

mongodb - Netty,服务器使用来自 mongodb 的数据连接客户端

mongodb - 如何在 MongoDB 中汇总总和以获得总计数?

Jquery UI Draggable 克隆在同一 ul 或 div 中

c# - Bitmap.Clone() 和 new Bitmap(Bitmap) 有什么区别?

java - 类似于 Windows 中的日期时间选择器

Java 读取 txt.file - 访问被拒绝?

java - JDBC 通过 PreparedStatement 中的 executeBatch 调用保证原子操作

java - java或其他gc-lang中的gc会自动关闭未关闭的资源吗?以及为什么

python - MongoDB 不允许在 key 中使用 '.'

c - 为什么在克隆系统调用后重新分配死锁?