我怎样才能让这个复制构造函数在 java 中进行深度复制?
How can I make this copy constructor make a deep copy in java?
嘿嘿,看这个class
public class ComplexFoo {
TreeMap<String, String> field1;
double[] field2;
public ComplexFoo() {
field1 = new TreeMap<String, String>();
field2 = new double[1];
}
public ComplexFoo(ComplexFoo cf){
field1 = cf.field1;
field2 = cf.field2;
}
public static void main(final String[] args) {
ComplexFoo foo = new ComplexFoo();
foo.field2[0] = 5.0;
ComplexFoo bar = new ComplexFoo(foo);
bar.field2[0] = 3.0;
System.out.println(foo.field2[0]);
}
}
这会打印 3.0。我想那是因为我的复制构造函数只复制了对 Array/Map 的引用,而不是真正的数据结构。我必须更改什么才能确保深度复制?
如果我编写一个 class 将 ComplexFoo 作为字段,我是否必须编写一个使用 ComplexFoos 复制构造函数的复制构造函数,或者是否有任何类型的递归深度复制机制我可以使用?
您可以进行空测试和验证:
public ComplexFoo(ComplexFoo cf){
field1 = new TreeMap<>(cf.field1);
field2 = Arrays.copyOf(cf.field2, cf.field2.length);
}
这不是深拷贝:
public ComplexFoo(ComplexFoo cf){
field1 = cf.field1;
field2 = cf.field2;
}
新创建的ComplexFoo
实例引用作为参数提供的实例字段。
要进行深拷贝,您必须创建新对象。
TreeMap(Collection)
完成从 Collection
参数创建新 TreeMap
的工作。请注意,您不需要克隆 TreeMap
的元素,因为用作键值的类型实际上是不可变的:<String, String>
.
Object.clone()
适用于数字基元值的一维数组。
所以你可以写:
public ComplexFoo(ComplexFoo cf){
field1 = new TreeMap<>(cf.field1);
field2 = cf.field2.clone();
}
嘿嘿,看这个class
public class ComplexFoo {
TreeMap<String, String> field1;
double[] field2;
public ComplexFoo() {
field1 = new TreeMap<String, String>();
field2 = new double[1];
}
public ComplexFoo(ComplexFoo cf){
field1 = cf.field1;
field2 = cf.field2;
}
public static void main(final String[] args) {
ComplexFoo foo = new ComplexFoo();
foo.field2[0] = 5.0;
ComplexFoo bar = new ComplexFoo(foo);
bar.field2[0] = 3.0;
System.out.println(foo.field2[0]);
}
}
这会打印 3.0。我想那是因为我的复制构造函数只复制了对 Array/Map 的引用,而不是真正的数据结构。我必须更改什么才能确保深度复制?
如果我编写一个 class 将 ComplexFoo 作为字段,我是否必须编写一个使用 ComplexFoos 复制构造函数的复制构造函数,或者是否有任何类型的递归深度复制机制我可以使用?
您可以进行空测试和验证:
public ComplexFoo(ComplexFoo cf){
field1 = new TreeMap<>(cf.field1);
field2 = Arrays.copyOf(cf.field2, cf.field2.length);
}
这不是深拷贝:
public ComplexFoo(ComplexFoo cf){
field1 = cf.field1;
field2 = cf.field2;
}
新创建的ComplexFoo
实例引用作为参数提供的实例字段。
要进行深拷贝,您必须创建新对象。
TreeMap(Collection)
完成从 Collection
参数创建新 TreeMap
的工作。请注意,您不需要克隆 TreeMap
的元素,因为用作键值的类型实际上是不可变的:<String, String>
.
Object.clone()
适用于数字基元值的一维数组。
所以你可以写:
public ComplexFoo(ComplexFoo cf){
field1 = new TreeMap<>(cf.field1);
field2 = cf.field2.clone();
}