Java 如何正确克隆对象类?

Java 如何正确克隆对象类?,java,copy,copy-constructor,deep-copy,Java,Copy,Copy Constructor,Deep Copy,我有一个包含字符串字段和映射的POJO类。 我阅读了Joshua Bloch关于克隆对象的有效Java片段,但我认为这个案例并不是那么简单。 我有一些POJO,我想用复制构造函数的方法来克隆它们,但我不知道如何才能克隆具有对象的映射 我知道这个对象可能是一个简单的不可变对象,例如字符串类,但有时它可能是一个完全不同的POJO,甚至是列表或映射。我认为唯一可行的方法是使用instanceof在构造函数中进行一些检查,但这很难看(我必须对List、Map和每个POJO进行检查,对吗?) 也许我应该改

我有一个包含字符串字段和映射的POJO类。 我阅读了Joshua Bloch关于克隆对象的有效Java片段,但我认为这个案例并不是那么简单。 我有一些POJO,我想用复制构造函数的方法来克隆它们,但我不知道如何才能克隆具有对象的映射

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

也许我应该改变实现可克隆接口的方法

我还看到了一个带有序列化的克隆方法,但我认为这也是一个丑陋的解决方案,它的性能会比使用复制构造函数方法时的性能更差


你能告诉我如何克隆我的POJO吗?

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

为什么要首先克隆它们?尤其是你甚至不知道他们是什么类型的人。您甚至不知道它们的类型,因此无法修改它们。我18年来从未在生产代码中使用过
clone()
。为什么?因为我有一个POJO“a”,它有一个具有不同属性的POJO“B”列表,我想要一个完全不同的对象,一个新的副本。我只需要它,因为我想创建几个pojo“A”的实例。这些POJO“A”在POJO“B”中应该有不同的值,如果POJO“A”引用了相同的“B”POJO,那么我将无法在不同的POJO“A”中设置不同的值,所以,您假设对象是JavaBeans?假设是正确的,因为它们是JavaBeans,但是我已经尝试过了,但没有成功,因为作为主JavaBeans属性的JavaBeans没有被克隆。假设我有一个名为“Main”的JB,它的第二个JB的字段名为“Property”。我克隆了几次JB“Main”,它们引用了与原始“Main”JavaBean相同的“Property”JB。换句话说,bean引用的任何对象都与克隆共享,而不是依次被克隆。