Java 对象复制最佳选择?

标签 java object deep-copy default-copy-constructor

<分区>

Possible Duplicate:
How do I copy an object in Java?

我需要在 Java 中复制一个对象(即“按值而不是按引用”复制对象,以便新对象不仅仅是对旧对象的引用)。我厌倦了实现可克隆,更愿意使用复制构造函数。但是,我需要复制的类有许多需要复制的成员变量(超过 100 个),因此向类添加一个新的构造函数只是为了复制(这只在我的应用程序的一部分中需要)似乎是一个糟糕的解决方案由于其巨大的长度。

有更好的解决方案吗?我应该只使用 clone() 吗?我可以创建一个复制构造函数,而不是 1 乘 1 地复制所有字段,我可以反射(reflection)地做到这一点吗?谢谢。

我基本上只需要创建一个与旧对象相同的新对象,但更改了一些(大约 100 个中的 10 个)字段(但我仍然需要两个对象..所以新对象不能是引用旧的)。我愿意接受任何建议。

最佳答案

clone() 进行浅表克隆 - 它仅复制第一层字段。您应该避免使用 clone()Cloneable,因为很难正确实现它,而且很可能会损坏某些东西,尽管不会立即可见。请参阅 what Joshua Bloch 说明这一点。

如果您想要深拷贝 - 即克隆整个对象层次结构,我可以建议两个选项:

但是,如果您想要浅拷贝 - 即您仍然希望将所有字段复制到一个新对象,但是字段和字段的字段(等等)指向它们的原始值,那么您可以使用 BeanUtils.clone(..) (来自 commons-beanutils )

除了克隆问题之外 - 拥有 100 个成员变量不是一个好兆头。考虑将您的类拆分为多个类(更新:和多个表,使用外键。当然,如果适用的话。如果这些确实是同一对象的属性,那么很好)

关于Java 对象复制最佳选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144673/

相关文章:

Java+DOM : How do I convert a DOM tree without namespaces to a namespace-aware DOM tree?

Javascript数组对象到逗号分隔的单行数组

silverlight - 集合中对象到对象属性的映射

java - EJB 容器内可能的 JNDI 查找

java - 返回随机字符串数组

java - 使用 Java 正则表达式解析 Drools 规则文件

c - 如何提供一致的接口(interface): Deep-Copy OpenSSL structs or Document Distinct Cases?

C++ 对象组合、依赖注入(inject)和复制构造函数

oop - 我是否正确理解了类(class)是什么?

Swift 2.0 按值传递