Java 规范java.lang.Cloneable
接口将自身定义为表示扩展它的任何对象也实现了clone()
休眠的方法java.lang.Object
。具体来说,它说:
一个类实现了Cloneable
接口来指示java.lang.Object#clone()
方法,该方法对该类的实例进行逐字段复制是合法的。
对我来说,这意味着应该假设每个扩展的类Cloneable
因此也有一个public Object clone()
里面的方法。这使得很容易假设以下是有效的方法:
public static makeACloneFrom(Cloneable c)
{
return c.clone();
}
然而,事实并非如此,因为整个Cloneable
源代码(无javadoc)很简单
package java.lang;
public interface Cloneable {
}
意思就是Cloneable#clone()
不存在(并且尝试编译上面的示例方法会引发编译时错误,内容类似于“cannot find symbol: method clone()
"). 源代码不应该是Cloneable
包含某些东西的效果public Cloneable clone();
?
为什么我们不允许假设一个类实现了Cloneable
has a public Cloneable clone()
method?
因为它的界面设计很糟糕。
From (抱歉,Google 图书没有第二版的预览):
第 11 项:覆盖clone
明智地
The Cloneable
接口的目的是作为混合接口(物品
18) 让对象宣传它们允许克隆。很遗憾,
它无法达到这个目的。它的主要缺陷是缺乏clone
方法,以及Object
's clone
方法受到保护。你
不能,诉诸于反射(第 53 项),调用clone
对象上的方法仅仅因为它实现了Cloneable
。甚至一个
反射调用可能会失败,因为不能保证
对象有一个可访问的clone
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)