Cloneable在Java中天生就坏了。具体来说,我对接口的最大问题是它需要一个不定义方法本身的方法行为。因此,如果遍历Cloneable列表,则必须使用反射来访问其定义的行为。但是,在 Java 8 中,我们现在有了默认方法,现在我问clone()为什么Cloneable.
我理解为什么接口不能默认 Object 方法,但是,这是一个明确的设计决定,因此可以进行例外处理。
我有点设想弃用Object.clone()并将其内部代码更改为:
if(this instanceof Cloneable) {
return ((Cloneable) this).clone();
}
else {
throw new CloneNotSupportedException();
}
并继续使用任何魔法clone()作为Cloneable. 这并不能真正解决clone()仍然很容易错误实施的问题,但这本身就是另一个讨论。
据我所知,这种变化将完全向后兼容:
- 当前覆盖
clone()但未实现的类Cloneable(为什么?!)在技术上仍然可以(即使在功能上是不可能的,但这与以前没有什么不同)。 - 当前覆盖
clone()但确实实现的类Cloneable在其实现中仍将发挥相同的作用。 - 当前未覆盖
clone()但已实现Cloneable(为什么?!)的类现在将遵循规范,即使它在功能上并不完全正确。 - 那些使用反射和引用的
Object.clone()仍然可以正常工作。 super.clone()即使引用Object.clone().
更不用说这将解决一个巨大的问题Cloneable。虽然繁琐并且仍然很容易错误地实现,但它可以解决接口的一个巨大的面向对象问题。
我能看到的唯一问题是那些实现Cloneable没有义务覆盖的问题clone(),但这与以前没有什么不同。
有没有内部讨论过,但从未实现?如果是这样,为什么?如果是因为接口不能默认 Object 方法,那么在这种情况下创建异常是否有意义,因为所有继承的对象Cloneable都在期待clone()?