让我的类实现可克隆有什么意义?

2022-09-01 17:17:09

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

类实现 Cloneable 接口,以向 Object.clone() 方法指示该方法对该类的实例进行字段对字段复制是合法的。在未实现 Cloneable 接口的实例上调用 Object 的 clone 方法会导致引发异常 CloneNotSupportedException。按照约定,实现此接口的类应使用公共方法重写 Object.clone(受保护)。有关重写此方法的详细信息,请参阅 Object.clone()。请注意,此接口不包含克隆方法。因此,仅凭它实现此接口这一事实就不可能克隆对象。即使以反射方式调用了 clone 方法,也不能保证它会成功。

我无法理解实现这个类的意义,正如文档中所说,该方法不是在接口中实现的,我必须实现它。那么为什么要使用这个类呢?为什么我不直接在我的类中编写一个方法来制作对象副本而不实现这个类?.clonecopyClass


答案 1

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

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

如果需要,您可以自定义该方法以制作更深入的副本。

调用几乎是必需的,因为除非该类是最终类,因此无法重写,否则该方法必须返回与调用它的对象相同的类的实例。因此,只需创建一个新实例并复制状态即可适用于此类,但不适用于所有子类。此外,您并不总是有权访问超类中包含的所有状态。super.clone()clone()

简而言之,您将对象的受保护克隆方法设为公共。该方法做的第一件事是(这不是真正的代码,但这是该方法所做的):Object.clone()

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

所以,只是一个标记接口,让方法知道它在调用时一定不会引发异常。CloneableObject.clone()

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


答案 2

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


推荐