我试图了解 Object.clone() 在 Java 中是如何工作的。我发现了以下事实:
Cloneable接口以向 Object.clone() 方法指示该方法对该类的实例进行逐字段复制是合法的。Object方法会导致抛出异常。cloneCloneableCloneNotSupportedExceptionCloneable接口不包含该clone方法。因此,实现Cloneable不负责因未实现而引发任何错误/异常clone()。Object.clone()是一个本机方法,它从此cpp方法中调用 并抛出。JVM_Clone jvm.cppCloneNotSupportedException疑点:
Q1. 为什么Java设计者会做出这样的设计选择并这样实现呢?为什么不在其自身clone()中进行定义Cloneable,如果实现类没有提供clone().
Q2。Cloneable为什么要在运行时检查实例是否实现?
Q3。有什么具体原因要在本机代码中检查它吗?
Q4。奇怪的是Object它本身并没有实现Cloneable,但提供了一个实现clone(),它反过来检查是否有任何类实现了Cloneable实现clone()。理想情况下,不应该Object实现Cloneable(声明clone())然后提供实现吗clone()?
PS:我知道在一个问题中提出多个问题是一个坏主意。但这些都是密切相关的问题。我很可能会问一个问题,比如“为什么不Cloneable包含clone()?” 但是,我觉得,为了更好地回答这个疑问,必须涵盖这一设计决策的各个微妙方面。我努力思考更多,并提出了可能的不同微妙方面,并逐点明确地询问它们,以便回答者不会错过它们并给出总体完整的答案。
问题是,他们想要提供 clone() 方法的默认实现,但当时不存在默认方法,因此他们只有 Object.clone 和 Cloneable 接口来表示它可以被克隆。所以这真的只是它老了。
正如另一位用户之前所说,克隆方法是本机方法,并且接口中也不允许使用该修饰符。将 Cloneable 设为抽象类不是一个选项,因为您将被迫扩展它并且无法扩展其他类,因为 Java 并不真正具有多重继承。我不知道为什么不仅仅所有对象都支持克隆。
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |