为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在java.lang.Object中保护clone()方法?

为什么在java.lang.Object中保护clone()方法?

慕少森 2019-07-30 11:11:48
为什么在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接口,用于对象宣传它们允许克隆。不幸的是它无法达到此目的......这是一种非常非典型的接口使用,而不是一个被模拟的接口...为了实现接口对类产生任何影响,它和它的所有超类必须服从一个相当复杂,不可执行且基本上没有文档的协议 “


查看完整回答
反对 回复 2019-07-30
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

clone是受保护的,因为它应该被覆盖,以便它特定于当前类。虽然可以创建一个clone克隆任何对象的公共方法,但这不如专门针对需要它的类编写的方法那么好。


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 1385 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号