我无法理解第11项下的以下行:从Effective Java明智地覆盖克隆
行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。 (PG:55)
还提到'没有构造函数被调用'。所以,我很困惑。
答案 0 :(得分:3)
这意味着,鉴于课程:
class Foo implements Cloneable {
private Bar bar;
public Foo clone() {
// implementations below
}
}
class Bar implements Cloneable {
public Bar clone() {
return (Bar) super.clone();
}
}
Foo上的clone()
方法可以通过几种方式实现;不建议使用第一个变体。
public Foo clone() {
Foo result = new Foo(); // This is what "no constructor is called" refers to.
result.bar = new Bar();
return result;
}
public Foo clone() {
Foo result = super.clone();
result.bar = new Bar(); // this is the constructor you're allowed to call
return result;
}
public Foo clone() {
Foo result = super.clone();
result.bar = result.bar.clone(); // if the types of your fields are cloneable
return result;
}
答案 1 :(得分:1)
您应该通过调用super.clone()
来获取返回的对象,而不是通过调用构造函数来获取。这对于确保正确处理类加载器问题非常重要。但是,如果通过调用super.clone()
获得的对象在返回之前需要进一步初始化 - 例如,如果您需要为引用成员创建一个新的包含对象,那么super.clone()
只会将引用复制到同一个对象 - 那么正常构造这些对象是完全可以的。