我问的是关于“如何在 java 中制作不可变对象(immutable对象)”的非常基础的问题。
所以我有一个来自第三方的 Address 类,它不继承任何 Cloneable 接口(interface)及其可变类。看起来像这样
public class Address {
private String city;
private String address;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
现在我有另一个名为 Person 的不可变类,它实现了 Cloneable 接口(interface)并重写了 clone 方法。类看起来像这样
public class Person implements Cloneable {
private String name;
private Address address;
public Person() {
}
public Person(String name, Address address) {
this.name = name;
this.address = address;
//this.address = (Address) address.clone();
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
return super.clone();
}
public Address getAddress() {
return address;
}
@Override
public String toString() {
return "name:" + name + ", address" + address.getAddress() + ", city="
+ address.getCity();
}
}
现在我的问题是,我当然可以克隆 Person 类对象,但是如何克隆地址类实例。我还阅读了一些关于浅克隆和深度克隆的文章。但我无法理解使用 30 方 API 可以进行多深的克隆。如果我对克隆的理解有误,请纠正我。
最佳答案
我认为您理解得很好:clone
是一种糟糕的机制,实际上有一个完整的错误列表(查看 Effective Java)。与您的情况特别相关,您不能使用 final
字段深度克隆对象。
而是选择一种自定义机制来复制对象,例如复制构造函数或专用方法。
内存中序列化-反序列化循环也有一个技巧,但我不会真正推荐它,除非您的列表中的性能和效率不高。
关于java - 如何创建具有可变对象作为引用的不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566725/