可以使用构造函数克隆方法创建对象

Ana*_*and 8 java clone

我一直认为在clone()不调用构造函数的情况下创建一个对象.

但是,在阅读Effective Java Item 11:明智地覆盖克隆时,我发现了一个声明

"没有被称为构造函数"的规定过于强烈.一个行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象.如果类是final,clone甚至可以返回由构造函数创建的对象.

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

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果这个类不是最终的,我猜你可以检查实例是否只是"只是"类型覆盖的一个实例,clone()并在不同的情况下以不同的方式处理...但这样做会很奇怪.

  • @Anand:`clone()`必须返回与原始实例相同类型的实例.如果该类是非final的,则必须考虑`this`将引用子类的实例的可能性. (3认同)