让我的班级实现Cloneable有什么意义?

时间:2013-05-12 13:06:21

标签: java cloneable

我遇到了一些实现Clonable的类代码,文档声明:

  

一个类实现了Cloneable接口,以向Object.clone()方法指示该方法合法地为该类的实例创建一个字段的字段副本。       在未实现Cloneable接口的实例上调用Object的clone方法会导致抛出异常CloneNotSupportedException。       按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护)。有关重写此方法的详细信息,请参阅Object.clone()。       请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。

我无法理解实现此类的重点,正如文档中所述,.clone方法未在接口中实现,我必须实现它。那么为什么要使用这门课?为什么我不在我的类中编写方法copyClass来制作对象副本而不执行此类?

3 个答案:

答案 0 :(得分:27)

要实现克隆方法,您只需执行以下操作:

public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

当然,您可以根据需要自定义方法以制作更深层的副本。

调用super.clone()几乎是强制性的,因为除非该类是final且无法覆盖,否则clone()方法必须返回与调用它的对象相同的类的实例。因此,简单地创建新实例并复制状态将适用于此类,但不适用于所有子类。此外,您并不总是可以访问超类中包含的所有状态。

简而言之,您将Object的受保护克隆方法设为public。 Object.clone()方法的第一件事就是(这不是真正的代码,但这就是方法的作用):

if (!(this instanceof Cloneable)) {
    throw new CloneNotSupportedException();
}

因此,Cloneable只是一个标记接口,让Object.clone()方法知道它在调用时不能抛出异常。

这是Java中设计最糟糕的部分之一。通常,您应该更喜欢使用复制构造函数而不是clone()

答案 1 :(得分:1)

它允许您编写更多通用代码。如果您有多个实现Cloneable接口的类,并希望将它们的实例作为参数传递给方法,则不必创建多个方法,这些方法与一个变量类型不同,您只需使用Cloneable t即可。它与其他接口相同。并且,与其他所有接口相同,它有点多重继承。实现这些接口也使您的代码更加清晰。

答案 2 :(得分:0)

除了别人所说的那样,在实现原型设计模式时经常使用Cloneable。