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

时间:2016-09-05 11:37:51

标签: java 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()

然而,虽然在一些遗留代码中遇到了这个问题,但我只是想知道:这实际上是危险的吗?或者只是创意,但实际上风格不好?

1 个答案:

答案 0 :(得分:1)

  

这实际上有危险吗?或者只是创意,但实际上风格不好?

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

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

如果您使用super.clone(),则无需担心这些问题。