我听说你应该在你的代码中避免它,但它是出于某种原因实现的,所以是否有使用它实际上是一个好的(或不错的)选择的情况,或者我应该总是尽量避免它?
如果你读过我书中关于克隆的文章,特别是如果你在字里行间阅读,你就会知道我认为克隆已经被深深地破坏了。有一些设计缺陷,其中最大的是 Cloneable 接口没有克隆方法。这意味着它根本不起作用:制作可克隆的东西并没有说明你可以用它做什么。相反,它说明了它可以在内部做什么。它说如果通过重复调用 super.clone 最终调用了 Object 的 clone 方法,该方法将返回原始字段的副本。
但是它并没有说明您可以使用实现 Cloneable 接口的对象做什么,这意味着您不能进行多态克隆操作。如果我有一个 Cloneable 数组,您会认为我可以运行该数组并克隆每个元素以制作该数组的深层副本,但我不能。您不能将某些内容强制转换为 Cloneable 并调用 clone 方法,因为 Cloneable 没有公共克隆方法,Object 也没有。如果您尝试强制转换为 Cloneable 并调用 clone 方法,编译器会说您正在尝试调用 object 上的 protected clone 方法。
很遗憾 Cloneable 被破坏了,但它发生了。最初的 Java API 在紧迫的期限内完成得非常快,以满足即将关闭的市场窗口。最初的 Java 团队做了令人难以置信的工作,但并非所有的 API 都是完美的。Cloneable 是一个弱点,我认为人们应该意识到它的局限性。
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |