Java中的可克隆接口(Cloneable interface)有什么用途?

7

实现Cloneable接口有什么用处,既然它只是一个标记接口?

我可以在我的类中随时创建一个public Object clone()方法。那么Cloneable接口的实际目的是什么?

5个回答

7
这是因为clone()方法将抛出CloneNotSupportedException,如果对象不是Cloneable的。你应该查看clone()方法的文档。下面是Object类中声明clone()方法的方式:
protected Object clone() throws CloneNotSupportedException

注意:

同时,已经意识到 Clone 存在问题。 这篇回答 解释了为什么会有问题以及如何避免使用它。


4

Cloneable 设计成一个标记接口是一个错误。

不过,它确实能够“启用”Object类中的默认clone()实现。如果你没有实现Cloneable接口,那么调用super.clone()会抛出一个CloneNotSupportedException异常。


你能解释一下为什么那是个错误吗? - Mark Rotteveel
4
Cloneable 接口应该有一个 clone 方法,而 Object 中受保护的 clone 方法不应该需要“激活”。目前这个接口没有真正有用的作用,却占用了一个好名字并引起了混乱。 - Laurence Gonsalves

2

有些人说这是试图模仿C++的拷贝构造函数,但以下是关于它的先前类似问题StackOverflow的链接:关于Java的可克隆性


2

javadoc中指定了它的目的。这是为了指定允许克隆此类型的对象。

如果您的类依赖于Object.clone()方法提供的内置实现,则此标记接口可以启用逐字段克隆。(如果在不实现Cloneable的对象上调用内置克隆方法,则会抛出CloneNotSupportedException异常。)


2
clone()方法的目的是在调用它的对象上创建一个新实例(副本)。正如您在使用clone方法的答案中所看到的,您的类应该实现Cloneable接口。您可以选择如何实现克隆,您可以为您的类执行浅复制或深复制。您可以查看示例:http://javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接