我听说你应该在你的代码中避免使用它,但它是出于某种原因实现的,所以是否存在使用它实际上是一个好(或不坏)选择的情况,还是应该总是试图避免它?
答案 0 :(得分:3)
Josh Bloch answered this perfectly:
如果您已经阅读了我的书中有关克隆的项目,特别是如果您 在线之间阅读,你会知道我认为克隆是深刻的 破碎。有一些设计缺陷,其中最大的就是 可克隆的接口没有克隆方法。这意味着它 根本不起作用:制作Cloneable不会说什么 关于你可以用它做什么。相反,它说的是什么 它可以在内部完成。它说如果通过调用super.clone 反复它最终调用Object的clone方法,这个方法会 返回原始的字段副本。
但它没有说明你可以用一个对象做什么 实现Cloneable接口,这意味着你无法做到 多态克隆操作。如果我有一个Cloneable数组,你 会认为我可以运行该数组并克隆每个元素 制作数组的深层副本,但我不能。你不能施展 克隆的东西,并调用克隆方法,因为克隆 没有公共克隆方法,也没有Object。如果你试试 为了转换为Cloneable并调用clone方法,编译器会说 您正试图在对象上调用受保护的克隆方法。
令人遗憾的是Cloneable被破坏了,但它确实发生了。原本的 Java API在紧迫的期限内完成,以满足a 关闭市场窗口。最初的Java团队做了不可思议的工作, 但并非所有的API都是完美的。 Cloneable是一个弱点,我 认为人们应该意识到它的局限性。
答案 1 :(得分:0)
您应该尝试始终根据对象类型覆盖clone方法,但java clone()方法并不总是按照您的意愿执行。