【问题标题】:Can clone method create object using constructor可以使用构造函数克隆方法创建对象
【发布时间】:2016-06-19 21:26:11
【问题描述】:

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

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

“不调用构造函数”的规定太强了。一种 乖巧的克隆方法可以调用构造函数来创建对象 正在构建的克隆内部。如果类是最终的,则克隆 甚至可以返回由构造函数创建的对象。

谁能给我解释一下?

【问题讨论】:

  • clone() 方法不调用构造函数,它的默认行为是执行浅拷贝。但是如果我们想要执行深拷贝,我们需要覆盖clone() 方法,我们可以从中返回新的对象。

标签: java clone


【解决方案1】:

我一直认为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() 类型的实例,并在不同情况下以不同方式处理它...不过这样做会很奇怪。

【讨论】:

  • 为什么只有在课程是最终课程时才能这样做?如果我在非期末课上这样做,会有什么影响吗?
  • @Anand: clone() 必须返回与原始类型相同的实例。如果类不是最终类,则必须考虑this 引用子类实例的可能性。
【解决方案2】:

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

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

我认为这可以用于目的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多