【发布时间】:2010-10-17 02:24:06
【问题描述】:
为什么java.lang.Cloneable接口中没有指定.clone()方法?
【问题讨论】:
标签: java clone specifications cloneable
为什么java.lang.Cloneable接口中没有指定.clone()方法?
【问题讨论】:
标签: java clone specifications cloneable
基本上,这是一个损坏的界面。 Ken Arnold 和 Bill Venners 在Java Design Issues 中讨论了它。
阿诺德:
如果我在这一点上是上帝,很多人可能很高兴我不是,我会说弃用
Cloneable并有一个Copyable,因为Cloneable有问题。除了拼写错误之外,Cloneable不包含clone方法。这意味着您无法测试某个东西是否是Cloneable的实例,将其转换为Cloneable,然后调用clone。您必须再次使用反射,这很糟糕。这只是一个问题,但我肯定会解决一个问题。
【讨论】:
Cloneable 的目的。 Cloneable 只是为了让Object.clone() 抛出异常。它从来都不是您调用clone 的接口。如果 Java 有这样的接口可能会很好,但缺少一个不会使另一个接口 (Cloneable) 损坏。
在 Java 错误数据库中查看此错误:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
本质上,这是 Java 早期版本中的一个设计缺陷,他们不打算在 Cloneable 接口中修复,因为这样做会破坏与某些现有代码的兼容性。
【讨论】:
const 参数,但是复制每个(可变)对象实例并不是一个好的解决方案。是的,Java 在某些方面很糟糕,这就是其中之一。使用 Kotlin / 数据类。
在 Java 中,存在标记接口的概念。 Cloneable 接口没有方法或字段,仅用于识别可克隆的语义。
来自dev-x 网站:
您经常会在 Java 中遇到没有行为的接口。换句话说,它们只是空的接口定义。这些被称为标记接口。 Java API 中的一些标记接口示例包括:
【讨论】:
在我从事的项目中,我们创建了一个名为 PublicCloneable 的接口, 它包含克隆方法并指定它是公共的。
我觉得这个很有用:有一个 clone 方法,但你无法访问它并没有多大帮助。
public interface PublicCloneable extends Cloneable {
public Object clone();
}
【讨论】:
因为克隆方法是在 Object 类中实现的,因为它的“特殊”条件:任何类型对象的内存副本。
【讨论】: