当前位置: 首页 > 面试题库 >

为什么人们如此害怕使用clone()(在collection和JDK类上)?

艾正浩
2023-03-14
问题内容

我曾多次争论使用clone()并不是一种不好的做法。是的,我知道争论。布洛赫说这很糟糕。他确实做到了,但是他说实施clone()是不好的。另一方面,使用克隆,尤其是如果由受信任的库(例如JDK)正确实现了克隆,则可以。

就在昨天,我讨论了我的一个答案,该讨论仅表明使用clone()for
ArrayList是可以的(我猜没有基于这个原因的支持)。

如果查看@authorArrayList,我们会看到一个熟悉的名字-Josh
Bloch。因此,clone()ArrayList(和其他收藏品)是完全正常的(看看他们的实现)。

同去的Calendar,也许是最的java.langjava.util类。

那么,给我一个 为什么不 clone()与JDK类 一起使用 的理由?


问题答案:

那么,给我一个为什么不对JDK类使用clone()的理由?

  • 给定一个ArrayList引用,您需要getClass检查一下它是否不是JDK类的子类。然后什么?潜在的子类不能被信任。大概子类将以某种方式具有不同的行为。
  • 它要求引用比更加具体List。有人不介意,但是大多数人认为那是个坏主意。
  • 您将不得不处理一个强制转换,这是不安全的。


 类似资料:
  • 问题内容: 为什么我们在Java中使用该方法?(请给出有关内存限制的答案。)这会减少内存使用吗?如果是,那怎么办?这样会减少内存泄漏的影响吗? 问题答案: 除了 不使用克隆外,还实现一个复制构造函数 ,您询问了内存限制。 克隆 的想法是创建克隆对象的精确副本。因此,在最坏的情况下,此后您将使用两倍的内存量。实际上- 少了一点,因为String经常被嵌入并且(通常)不会被克隆。即使由clone方法/

  • 问题内容: 因此,每本Java教科书都讨论Java的灵活性,因为Java可以在运行时加载类。只需将字符串拼凑在一起,然后交给,然后抓住并处理即可。理论上就这么多。 您能否举例说明如何使用Java类加载来实现原本不可能或不容易的功能?请注意,我 不是 问“有什么伟大的事情 可以 做什么?” -我正在寻找真实的示例,它是一个开源应用程序,或者-如果您可以在不给出过多细节的情况下进行描述-一个专有应用程

  • 从外观上看-似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么? 我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的。这两个实现似乎都提供了类似的功能。 谢谢

  • 我的一位同事最近在eclipse中创建了一个新项目,并使用内置的git客户端提交和推送。在我克隆到计算机并用eclipse打开后,我发现eclipse正在创建.classpath文件。CLASSPATH不是eclipse项目(也是.project)查找引用的JAR的关键文件吗?我在谷歌后非常困惑,看到所有的讨论都在谈论忽略他们。难道它们不是Eclipse正确工作的关键吗?为什么人们忽视了他们?如果

  • 问题内容: 从Java 5开始,我们已经对原始类型进行装箱/拆箱,因此将其包装为,依此类推。 我最近看到许多新的Java项目(肯定要求JRE的版本至少为5,如果不是6的话)正在使用int而不是,尽管使用后者要方便得多,因为它具有一些用于转换的辅助方法到long的值等。 为什么有些人仍然在Java中使用原始类型?有什么切实的好处吗? 问题答案: 在Joshua Bloch的有效Java条款 5:“避

  • 问题内容: 通过它的外观- 似乎创建了一个对象的克隆。如果是这样的话,那么与实现Cloneable接口有关的担忧(只有不可变对象才是新对象,因为可变对象复制了引用)是最好的,为什么? 昨天我实现了cloneable,然后意识到我必须对非 String / Primative 元素提供自己的修改。然后,我被告知我正在使用哪个。两种实现似乎都提供了类似的功能。 谢谢 问题答案: Josh Bloch提