7

在Java中,要使一个类可克隆,我们需要实现Cloneable接口。实现这个接口,就是说这个类支持克隆。

但是,Java 语言设计者不将“允许克隆”作为每个类的默认功能的动机是什么?

我们已经存在浅拷贝的默认实现。那么为什么会有这个限制呢?

4

4 回答 4

5

考虑克隆具有嵌套属性的对象。你想递归多深?这对内存来说可能很困难,所以开发人员把它留给我们来决定。

于 2012-12-02T15:50:03.757 回答
4

这是一个标记接口,让 Java 知道实现类是有意为克隆而设计的(与其他标记接口的使用类似)。如果您进一步阅读,您会发现以下内容:

按照惯例,实现此接口的类应使用公共方法覆盖 Object.clone (受保护的)。有关覆盖此方法的详细信息,请参阅 Object.clone()。

您需要提供自定义方法进行克隆。通过拥有 interface Cloneable,Java 知道您有意支持对象的克隆。通过提供您的自定义clone方法,您将覆盖clone对象的默认方法。

这样,您可以灵活地决定(Mark)哪些对象可以被克隆,哪些不能。如果可以克隆,那么可以达到什么级别(在对象图情况下非常有用)。

于 2012-12-02T15:49:03.843 回答
0

许多原因阻碍了这一点,主要原因是克隆对于一般情况来说不是一个可以解决的问题,就像序列化一样。

默认情况下获得的浅拷贝在许多情况下会破坏对象的不变量,因此它作为一般的默认克隆机制不适用。

于 2012-12-02T15:48:40.263 回答
0

“可克隆”接口是称为“标记类”的设计模式的一部分。基本上,在 clone 方法中会引用“Cloneable”类型。当您实现可克隆接口时,这意味着您的类可以被引用为“可克隆”类型。

实际上,另一个原因是您覆盖了“clone()”方法,并以您自己的特定方式进行克隆。这意味着您认为重要的数据存在于新类中。

于 2012-12-02T15:50:31.623 回答