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对象的内存副本。