如果某个类不是Cloneable
,则不能克隆此类的对象。那么为什么clone()
保留在Object
类而不是Cloneable
界面中?
答案 0 :(得分:2)
这是Java中的设计错误(是的,Java并不完美!)。
最好避免使用Java进行克隆。例如,Josh Bloch在Effective Java中指出,第11项:
Cloneable接口用作mixin接口(第18项) 用于宣传他们允许克隆的对象。不幸的是,它 没有达到这个目的。它的主要缺陷是它没有克隆 方法,并且Object的clone方法受到保护。没有,你不能 借助反射(第53项),在一个上调用克隆方法 对象只是因为它实现了Cloneable。即使是反光的 调用可能会失败,因为无法保证对象具有 可访问克隆方法。尽管有这个缺陷和其他,该设施是 广泛使用所以理解它是值得的。
如果希望对象可以克隆,请实现复制构造函数或复制方法。
答案 1 :(得分:0)
Cloneable是一个标记接口,对用户/开发人员来说就像是一个属性,看看该类是否为clonebale。
clone()保存在Object类中,因为在clone()实现中建议你调用super的clone(),这只有在超类具有克隆函数时才会发生,即使它没有标记为可克隆(通过实现Cloneable)因此保持对象中的clone()函数是有意义的。
clone()完全创建了一个类的不同实例,就像构造函数应该调用super的方法来创建一个完整的实例。