Object.clone()不调用super.clone()的实际后果是什么?



我知道实现Object#clone()的约定说你应该调用super.clone()来获得复制的对象。

但我只是想知道如果我不这样做会有什么后果。那么让我们假设这个例子:

class SomeClass implements Cloneable {
    private Object someField;
    public SomeClass(Object someField) {
        this.someField = Object someField;
    }
    public Object clone() {
        return new SomeClass(this.someField);
    }
}

我觉得这不是 (TM)。如果我想要复制构造函数或者复制方法,我就用这个,而不是Object#clone()

然而,当在一些遗留代码中偶然发现这一点时,我只是想知道:这真的很危险吗?或者只是创意,但实际上是糟糕的风格?

这真的很危险吗?或者只是有创意,但实际上是糟糕的风格?

危险在于SomeClass可能被子类化。这意味着子类也必须重写此方法,否则它实际上不会返回相同类型的实例。

另一个潜在的问题是,一个可选字段被添加到SomeClass,但您忘记更新clone()方法。

如果你使用super.clone(),你就不必担心这些问题。

最新更新