为什么在java.lang.Object中保护clone()方法?clone()定义为受保护的具体原因是java.lang.Object什么?
3 回答

慕妹3242003
TA贡献1824条经验 获得超6个赞
克隆被保护的事实是非常可疑的 - 因为该clone
方法未在Cloneable
接口中声明。
这使得该方法对于获取数据副本毫无用处,因为您无法说:
if(a instanceof Cloneable) { copy = ((Cloneable) a).clone();}
我认为,设计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);}
来自Josh Bloch的Effective Java的引用:
“Cloneable接口旨在作为一个mixin接口,用于对象宣传它们允许克隆。不幸的是它无法达到此目的......这是一种非常非典型的接口使用,而不是一个被模拟的接口...为了实现接口对类产生任何影响,它和它的所有超类必须服从一个相当复杂,不可执行且基本上没有文档的协议 “

江户川乱折腾
TA贡献1851条经验 获得超5个赞
clone
是受保护的,因为它应该被覆盖,以便它特定于当前类。虽然可以创建一个clone
克隆任何对象的公共方法,但这不如专门针对需要它的类编写的方法那么好。
添加回答
举报
0/150
提交
取消