oxb*_*kes 104
克隆被保护的事实是非常可疑的 - 因为该clone
方法未在Cloneable
接口中声明.
这使得该方法对于获取数据副本毫无用处,因为您无法说:
if(a instanceof Cloneable) {
copy = ((Cloneable) a).clone();
}
Run Code Online (Sandbox Code Playgroud)
我认为,设计Cloneable
是现在很大程度上被视为一个错误(以下引文).我通常希望能够实现接口Cloneable
但不一定要创建接口Cloneable
(类似于使用Serializable
).没有反思就无法做到这一点:
ISomething i = ...
if (i instanceof Cloneable) {
//DAMN! I Need to know about ISomethingImpl! Unless...
copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
}
Run Code Online (Sandbox Code Playgroud)
来自Josh Bloch的Effective Java的引用:
"Cloneable接口旨在作为一个mixin接口,用于对象宣传它们允许克隆.不幸的是它无法达到此目的......这是一种非常非典型的接口使用,而不是一个模拟的接口...为了实现接口对类产生任何影响,它和它的所有超类必须服从一个相当复杂,不可执行且基本上没有文档的协议 "
Bil*_*l K 27
Clonable接口只是一个标记,表示该类可以支持克隆.该方法受到保护,因为您不应该在对象上调用它,您可以(并且应该)将其覆盖为public.
来自Sun:
在Object类中,clone()方法被声明为protected.如果你所做的只是实现Cloneable,那么只有子类和同一个包的成员才能在对象上调用clone().要使任何包中的任何类能够访问clone()方法,您必须覆盖它并将其公开,如下所示.(当你重写一个方法时,你可以减少它的私有性,但不能更私密.这里,Object中的protected clone()方法被重写为公共方法.)
clone
是受保护的,因为它应该被覆盖,以便它特定于当前类.虽然可以创建一个clone
克隆任何对象的公共方法,但这不如专门针对需要它的类编写的方法那么好.