Object.clone() 不调用 super.clone() 的实际后果是什么?
What are actually the consequences of Object.clone() not calling 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()
.
然而,当我在一些遗留代码中偶然发现这一点时,我只是想知道:这真的很危险吗?还是只是有创意,其实画风不好?
Is this actually dangerous? Or just creative, but actually bad style?
危险在于 SomeClass
可能被子 class 编辑。这意味着子 class 也必须覆盖此方法,否则它实际上 return 不是同一类型的实例。
另一个潜在的问题是在SomeClass
中添加了一个可选字段,但您忘记更新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()
.
然而,当我在一些遗留代码中偶然发现这一点时,我只是想知道:这真的很危险吗?还是只是有创意,其实画风不好?
Is this actually dangerous? Or just creative, but actually bad style?
危险在于 SomeClass
可能被子 class 编辑。这意味着子 class 也必须覆盖此方法,否则它实际上 return 不是同一类型的实例。
另一个潜在的问题是在SomeClass
中添加了一个可选字段,但您忘记更新clone()
方法。
如果您使用super.clone()
,您就不必担心这些问题。