【问题标题】:Should I use Clone method in java?我应该在java中使用克隆方法吗?
【发布时间】:2014-12-22 02:20:45
【问题描述】:

我听说你应该在你的代码中避免它,但它是出于某种原因实现的,所以在某些情况下使用它实际上是一个好的(或不错的)选择,还是我应该总是尽量避免它?

【问题讨论】:

  • 我不会说你应该避免它。像几乎所有东西一样,您可以正确或错误地使用它...阅读有关原型模式的内容,这就是您可以正确使用它的方法...
  • 如果不确定,请自行实施,或者如果可能,最好查看源代码。使用 clone() 的主要问题是你不能总是知道它是否按预期工作(当然,除非你测试它)。例如,我很难获得一个 int 数组的克隆。然而,克隆的文档声明它应该返回对象的副本,所以我也在等待这个答案!
  • 我已经 17 年没用过它了,或者“复制构造函数”。
  • @EJP,您以前从未使用过新的 ArrayList(list) 复制构造函数吗?还是它的许多变体之一?
  • @EJP 我不知道为什么当ArrayList(Collection<? extends E> c) 执行与ArrayList(ArrayList<? extends E> list) 完全相同的操作时,你不认为它是一个复制构造函数。如果它长得像鸭子,叫起来像鸭子,那它很可能是鸭子……

标签: java copy clone


【解决方案1】:

您应该尝试始终根据对象类型覆盖 clone 方法,java clone() 方法并不总是按照您的意愿行事。

见:Deep copy, shallow copy, clone

【讨论】:

    【解决方案2】:

    Josh Bloch answered this perfectly:

    如果你读过我书中关于克隆的内容,尤其是如果你 字里行间,你会知道我认为克隆是深刻的 破碎的。有一些设计缺陷,其中最大的是 Cloneable 接口没有克隆方法。这意味着它 根本行不通:制作可克隆的东西并没有说明什么 关于你可以用它做什么。相反,它说明了什么 它可以在内部进行。它说如果通过调用 super.clone 反复调用 Object 的 clone 方法,这个方法将 返回原件的现场副本。

    但它并没有说明你可以用一个对象做什么 实现了 Cloneable 接口,这意味着你不能做一个 多态克隆操作。如果我有一个 Cloneable 数组,你 会认为我可以运行该数组并克隆每个元素 制作数组的深层副本,但我不能。你不能施放 可以克隆的东西并调用克隆方法,因为 Cloneable 没有公共克隆方法,Object 也没有。如果你试试 转换为 Cloneable 并调用 clone 方法,编译器会说 您正在尝试在对象上调用受保护的克隆方法。

    很遗憾,Cloneable 被破坏了,但它确实发生了。原本的 Java API 在紧迫的期限内很快完成,以满足 关闭市场窗口。最初的 Java 团队做了一件令人难以置信的工作, 但并非所有 API 都是完美的。可克隆是一个弱点,我 认为人们应该意识到它的局限性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2018-08-20
      • 2010-09-08
      • 1970-01-01
      • 2017-08-10
      • 2012-09-14
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多