Java:Cloneable接口的基本原理
为什么在java.lang.Cloneable
接口中没有指定.clone()
方法?
基本上,这是一个破碎的界面。 Ken Arnold和Bill Venners在“ Javadevise问题”中对此进行了讨论。
阿诺德:
如果我现在是上帝,而且很多人可能都很高兴我不是,我会说弃用
Cloneable
并有一个Copyable
,因为Cloneable
有问题。 除了拼写错误之外,Cloneable
不包含clone
方法。 这意味着你不能testing某些东西是否是Cloneable
一个实例,将它转换为Cloneable
并调用clone
。 你必须再次使用reflection,这是可怕的。 这只是一个问题,但我一定会解决的。
在Java bugs数据库中查看这个错误:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
从本质上讲,这是早期版本的Java中的一个devise缺陷,它们不打算在Cloneable接口中修复,因为这会破坏与某些现有代码的兼容性。
在Java中,有这个标记接口的概念。 Cloneable
接口没有方法或字段,仅用于标识可克隆的语义。
从dev-x网站:
通常你会遇到Java中没有行为的接口。 换句话说,它们只是空的接口定义。 这些被称为标记界面。 Java API中的标记接口的一些示例包括:
java.lang.Cloneable
java.io.Serializable
java.util.EventListener
在我工作的项目上,我们创build了一个名为PublicCloneable的接口,它包含clone方法并指定它是公共的。
我觉得这个有用:有一个克隆方法的事实,但你不能访问它并没有什么帮助。
public interface PublicCloneable extends Cloneable { public Object clone(); }
由于克隆方法由于其“特殊”条件而在Object类中实现:任何types对象的内存副本。