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()
?