Class 的深拷贝,在 Java 中有大量子类
Deep copy for Class with massive subclass in Java
我有这个class
class Cars implements Transport, Serializable, Cloneable {
private String type;
private Models[] cars;
private int number;
private static final long serialVersionUID = 1L;
Cars(String type, int number){
this.type = type;
this.number = number;
cars = new Models[number];
for (int i = 0; i < number; i++){
cars[i] = new Models("default"+i, Double.NaN);
}
}
private class Models implements Serializable{
private String model;
private double price;
我需要覆盖 clone() 以使用 super.clone() 深度复制此对象。我该怎么做?
您可能正在寻找 https://www.baeldung.com/java-deep-copy
中给出的内容
clone() 方法将为您return 提供一个浅拷贝。您必须使用新对象手动填充此浅表副本中的可变字段。这将使您的副本成为深层副本。
恕我直言,进行深度复制的最简单方法是为所有 类:
添加一个复制构造函数
Models
只有不可变属性,所以创建一个很容易:
public Models(Models other) {
this(other.model, other.price);
}
不幸的是 Cars
也有一个可变属性(Models
的数组)所以我们需要一些不同的东西来复制这个属性:
public Cars(Cars other) {
this.type = other.type;
this.number = other.number;
this.cars = Arrays.stream(other.cars)
.map(Models::new)
.toArray(Models[]::new);
}
不仅我们创建了一个新的阵列,而且每个个体Models
也是全新的。请注意,此构造函数依赖于 Models
.
的复制构造函数
因此,无需调用 Cars cloned = (Cars) myCar.clone();
,您只需执行以下操作:
Cars cloned = new Cars(myCar);
我有这个class
class Cars implements Transport, Serializable, Cloneable {
private String type;
private Models[] cars;
private int number;
private static final long serialVersionUID = 1L;
Cars(String type, int number){
this.type = type;
this.number = number;
cars = new Models[number];
for (int i = 0; i < number; i++){
cars[i] = new Models("default"+i, Double.NaN);
}
}
private class Models implements Serializable{
private String model;
private double price;
我需要覆盖 clone() 以使用 super.clone() 深度复制此对象。我该怎么做?
您可能正在寻找 https://www.baeldung.com/java-deep-copy
中给出的内容clone() 方法将为您return 提供一个浅拷贝。您必须使用新对象手动填充此浅表副本中的可变字段。这将使您的副本成为深层副本。
恕我直言,进行深度复制的最简单方法是为所有 类:
添加一个复制构造函数Models
只有不可变属性,所以创建一个很容易:
public Models(Models other) {
this(other.model, other.price);
}
不幸的是 Cars
也有一个可变属性(Models
的数组)所以我们需要一些不同的东西来复制这个属性:
public Cars(Cars other) {
this.type = other.type;
this.number = other.number;
this.cars = Arrays.stream(other.cars)
.map(Models::new)
.toArray(Models[]::new);
}
不仅我们创建了一个新的阵列,而且每个个体Models
也是全新的。请注意,此构造函数依赖于 Models
.
因此,无需调用 Cars cloned = (Cars) myCar.clone();
,您只需执行以下操作:
Cars cloned = new Cars(myCar);