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

时间:2013-07-31 07:46:01

标签: java clone

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

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

的声明
  

“没有被称为构造函数”的规定过于强大。一个   行为良好的clone方法可以调用构造函数来创建对象   正在构建的克隆内部。如果课程是最终的,请克隆   甚至可以返回由构造函数创建的对象。

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

2 个答案:

答案 0 :(得分: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()的类型的实例,并在不同的情况下以不同的方式处理它。这样做会很奇怪。

答案 1 :(得分:0)

我认为下面的部分代码总是创建新对象并提供给另一个类(即单身有用的帮助)。

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

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

public MyObject clone() {
    return new MyObject(this);
}