为什么Cloneable没有clone()?

问题描述 投票:3回答:1

我试图了解Object.clone()在Java中的工作方式。我遇到以下事实:

  • 一个类实现了Cloneable接口,以向Object.clone()方法指示该方法为该类的实例进行逐字段复制是合法的。
  • 在未实现Object接口的实例上调用cloneCloneable方法会导致抛出异常CloneNotSupportedException
  • 但是,请注意Cloneable接口不包含clone方法。因此,由于未实现Cloneable而引发任何错误/异常,因此实现clone()不负责。
  • 相反,Object.clone()是本机方法,在此cpp方法中,callsJVM_Clonefrom jvm.cppjvm.cppCloneNotSupportedException
  • 问题:

Q1。

为什么Java设计人员会做出这样的设计选择并像这样实现?为什么在thrown本身中没有定义clone(),如果实现类未提供Cloneable的实现,则会给出编译时错误。

Q2。

为什么要在运行时检查实例是否实现clone()

Q3。

是否有任何特定原因需要在本机代码中进行检查?

Q4。

奇怪的是Cloneable本身不实现Object,但是提供了Cloneable的实现,该实现反过来检查是否有实现clone()的类实现了Cloneable。理想情况下clone()是否不应该实现Object(声明Cloneable),然后为clone()提供实现?

PS:

我知道在一个问题中问多个问题是一个坏主意。但是这些都是非常相关的问题。我可以很好地问一个问题,例如“为什么使clone()不包含Cloneable?”但是,我觉得,为了更好地回答这一疑问,必须涵盖这一设计决策的各个微妙方面。我付出了更多的思考,并提出了可能不同的细微方面,并明确地逐个询问了他们,​​以使answrer不会错过它们,并给出完整的完整答案。

我试图了解Object.clone()在Java中的工作方式。我遇到了以下事实:一个类实现了Cloneable接口,以向Object.clone()方法指示它对.....>

java
1个回答
0
投票

事实是,他们希望提供clone()方法的默认实现,但是那时不存在默认方法,因此他们只有Object.clone和Cloneable接口,以表示可以对其进行克隆。因此,实际上只是它很旧。

© www.soinside.com 2019 - 2024. All rights reserved.