【发布时间】:2015-07-22 14:53:55
【问题描述】:
我问的是关于“如何在 java 中制作不可变对象”的非常基础的问题。
所以我有一个来自第三方的 Address 类,它不继承任何 Cloneable 接口及其可变类。看起来是这样的
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 接口并覆盖了克隆方法。类看起来像这样
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 可以完成多深的克隆。或者,如果我对克隆的理解有误,请纠正我。
【问题讨论】:
-
“实现 Cloneable”不是一个好主意。
-
Address类非常简单,因此您可以创建自己的类来扩展 Address 并实现 Cloneable。话虽如此,我在这里同意 Raedwald。请看一下这个答案:stackoverflow.com/a/1067437/1011791 -
注意:您的
clone()方法目前总是返回super.clone()。请改用return person! -
所以我必须为每个没有实现 Clonable 接口并且可以引用到不可变对象的类编写 Wrapper。这是个好主意吗?
-
克隆很痛苦。如果可能的话,避免它。你真的需要克隆吗?你想用它做什么?
标签: java