当前位置: 首页 > 知识库问答 >
问题:

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

谷博艺
2023-03-14

我遇到了一些实现clonable的类代码,文档中写道:

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

我不能理解实现这个类的意义,正如文档中所说的那样,.clone方法没有在接口中实现,我必须实现它。那么为什么要使用这个类呢?为什么我不在我的类中编写一个方法copyclass,使对象在不实现该类的情况下进行复制呢?

共有1个答案

昝成弘
2023-03-14

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

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

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

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

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

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

因此,cloneable只是一个标记接口,让object.clone()方法知道它在调用时不能引发异常。

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

 类似资料:
  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?

  • 您会注意到,我已经在目录本身的克隆方法中克隆了一个product类对象,但是您可能会注意到,主类已经测试了它,并且它工作了,所以product类的克隆是成功的。 你能看出问题所在吗?我知道也会有很多小错误的编码礼仪和可能更容易的方法做事情,但我只是一个初学者。我必须实现deep copy,而且它必须有意义,所以克隆product类是不够的,我想创建一个方法来克隆整个目录,所以如果要用一台新的机器替

  • 在这个bug报告中,Doug Lea写道(指的是JDK 5.0的预发布版本): 附言。我知道不推荐使用,并且内部基于。

  • 因此,我的问题是:为什么还没有被否决?如果核心Java团队已经决定它是坏的,那么他们一定也考虑过弃用。他们反对这样做的理由是什么(在Java8中,它仍然没有被反对)?

  • 众所周知,是无法修复的(有关更多信息,请参见本问题中的讨论)。 关于替代方案和“我如何做得对”的最后一个问题已经有几年的历史了: null 类将实现的某种接口:. 深度复制。如果的istance引用的实例,则应引用新的. 复制到指定的目标:. 多态复制:如果扩展,则应将的所有属性从复制到。 当然,我可以自己实现所有这些,但是有标准接口不是很合理吗?还是我漏掉了什么? 我的上下文的一点背景。我经常使

  • 本文向大家介绍为什么要使用克隆?相关面试题,主要包含被问及为什么要使用克隆?时的应答技巧和注意事项,需要的朋友参考一下 克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。