2015-05-16 66 views
0

我有一个包含字符串字段和Map的POJO类。 我读了关于克隆对象的Joshua Bloch Effective Java片段,但我认为这种情况并非如此微不足道。 我有几个POJO,我想用复制构造函数的方法克隆它们,但我不知道如何克隆映射,因为值有一个对象?如何正确克隆对象类?

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

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

我也看到了一个序列化的克隆方法,但我认为这也是一个丑陋的解决方案,并且它的性能会比使用Copy构造器方法时糟糕。

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

+3

为什么要克隆他们呢?特别是如果你甚至不知道它们是什么类型。因为你甚至不知道它们的类型,所以你无法修改它们。 –

+0

18年来我从未在生产代码中使用过clone()。 – EJP

+0

为什么?因为我有一个POJO“A”,其中包含具有不同属性的POJO列表“B”,并且我想要完全不同的对象,一个新副本。我只需要它,因为我想创建pojo“A”的几个实例。那些POJO“A”应该在POJO“B”中具有不同的值,并且如果POJO“A”将参照相同的“B”POJO,那么我将不能在不同的POJO“A”中设置不同的值。 –

回答

0

您可以检查Apache CommonsBeanUtils。它有cloneBean(Object bean)这个方法可以克隆所有的属性,即使这个类没有实现Cloneable接口。

+0

那么,你假设对象是JavaBeans? – RealSkeptic

+0

这个假设是正确的,因为它们是JavaBean,但是我已经尝试过了,并且它没有工作,因为JavaBeans是Main JavaBeans的属性没有被克隆。假设我有称为“主”的JB,其中第二个JB叫做“属性”。我几次克隆了JB“Main”,并且他们引用了与最初的“Main”JavaBean相同的“Property”JB。 –

+0

来自文档: 注意:此方法创建一个浅层克隆。换句话说,Bean引用的任何对象都是与克隆共享的,而不是依次被克隆。 –