【问题标题】:How to clone properly Object class?如何正确克隆对象类?
【发布时间】:2015-05-16 20:46:30
【问题描述】:

我有一个 POJO 类,它包含字符串字段和一个 Map。 我阅读了关于克隆对象的 Joshua Bloch Effective Java 片段,但我认为这个案例并不是那么简单。 我有几个 POJO,我想使用 Copy Constructor 方法克隆它们,但我不知道如何克隆作为值具有对象的映射?

我知道这个 Object 可能是一个简单的不可变对象,例如一个 String 类,但有时它可能是一个完全不同的 POJO,甚至是列表或映射。我认为它可能起作用的唯一方法是使用 instanceof 在构造函数中进行一些检查,但这很丑陋(我必须检查 List、Map 和每个 POJO 对吗?)。

也许我应该改变实现 Cloneable 接口的方法?

我还看到了一个带有序列化的克隆方法,但我认为这也是一个丑陋的解决方案,并且它的性能会最差,例如使用 Copy Constructor 方法时。

你能给我一个建议,我应该如何克隆我的 POJO?

【问题讨论】:

  • 为什么首先要克隆它们?特别是如果你甚至不知道它们是什么类型的。无论如何你都无法修改它们,因为你甚至不知道它们的类型。
  • 18 年来我从未在生产代码中使用过clone()
  • 为什么?因为我有一个 POJO“A”,它有一个具有不同属性的 POJO“B”列表,我想要完全不同的对象,一个新副本。我只需要它,因为我想创建几个 pojo "A" 的实例。那些 POJO“A”在 POJO“B”中应该有不同的值,如果 POJO“A”将引用相同的“B”POJO,那么我将无法在不同的 POJO“A”中设置不同的值

标签: java copy copy-constructor deep-copy


【解决方案1】:

您可以查看 Apache Commons BeanUtils 。它有cloneBean(Object bean) 方法,即使该类没有实现Cloneable 接口,也会克隆所有属性。

【讨论】:

  • 那么,您假设对象是 JavaBeans?
  • 假设是正确的,因为它们是 JavaBeans,但是我已经尝试过了,它没有工作,因为作为 Main JavaBeans 属性的 JavaBeans 没有被克隆。假设我有一个名为“Main”的 JB,它对第二个 JB 有一个名为“Property”的字段。我已经克隆了几次 JB“Main”,它们引用了与原始“Main”JavaBean 相同的“Property”JB。
  • 来自文档:注意:此方法创建一个浅克隆。换句话说,bean 引用的任何对象都与克隆共享,而不是依次克隆。
猜你喜欢
  • 2010-10-18
相关资源
最近更新 更多