8

我一直认为clone()创建一个对象而不调用构造函数。

但是,在阅读 Effective Java Item 11: Override clone judiciously时,我发现了一个声明,它说

“不调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果类是 final 的,clone 甚至可以返回一个由构造函数创建的对象。

有人可以向我解释一下吗?

4

2 回答 2

13

我一直认为 clone() 创建一个对象而不调用构造函数。

中的实现Object.clone()不调用构造函数。

没有什么可以阻止您以自己的方式实现它。例如,这是一个完全有效的clone()实现:

public final class Foo implements Cloneable {
    private final int bar;

    public Foo(int bar) {
        this.bar = bar;
    }

    @Override
    public Object clone() {
        return new Foo(bar);
    }
}

如果类是 ,则只能(无条件地)执行此操作final,因为这样您就可以保证返回与原始对象类型相同的对象。

如果该类不是最终类,我想您可以检查该实例是否“只是”类型覆盖的实例,clone()并在不同情况下以不同方式处理它……不过这样做会很奇怪。

于 2013-07-31T07:48:51.187 回答
0

我认为下面的部分代码总是创建新对象并提供给其他类(即在单例中很有帮助)。

 @Override
    public Object clone() {
        return new Foo(bar);
    }

我认为这可以用于以下目的:

public MyObject clone() {
    return new MyObject(this);
}
于 2018-04-16T14:22:41.133 回答