为什么界面中没有.clone()
指定方法java.lang.Cloneable
?
基本上,它是一个破碎的界面.Ken Arnold和Bill Venners在Java设计问题中讨论了它.
阿诺德:
如果我在这一点上成为上帝,很多人可能很高兴我不是,我会说弃用
Cloneable
并且有一个Copyable
,因为Cloneable
有问题.除了它拼写错误的事实,Cloneable
不包含clone
方法.这意味着您无法测试某些内容是否是实例Cloneable
,将其转换为Cloneable
和调用clone
.你必须再次使用反射,这很糟糕.这只是一个问题,但我肯定会解决.
请参阅Java错误数据库中的此错误:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
从本质上讲,这是Java早期版本中的一个设计缺陷,它们不打算在Cloneable接口中修复,因为这样做会破坏与某些现有代码的兼容性.
在Java中,有标记接口的概念.该Cloneable
接口没有方法或字段,仅用于标识可克隆的语义.
来自dev-x网站:
通常,您会遇到没有行为的Java接口.换句话说,它们只是空接口定义.这些被称为标记接口.Java API中的标记接口的一些示例包括:
java.lang.Cloneable
java.io.Serializable
java.util.EventListener
在我工作的项目中,我们创建了一个名为PublicCloneable的接口,它包含clone方法并指定它是公共的.
我发现这个有用:事实上有一个克隆方法,但你无法访问它并没有多大帮助.
public interface PublicCloneable extends Cloneable { public Object clone(); }