【问题标题】:what is the need of cloning a object in Java在 Java 中克隆对象需要什么
【发布时间】:2012-04-21 08:19:52
【问题描述】:

我正在阅读有关 Java 中的克隆、如何制作对象的浅/深副本等内容。

我想知道为什么我需要在 Java 中创建对象克隆?任何实时示例都可能有助于理解。

【问题讨论】:

标签: java clone


【解决方案1】:

拥有某物的克隆副本意味着您可以拥有“之前”和“之后”版本。当您使用副本测试某些内容时,您可以不理会原件。您可以通过简单地恢复到原始版本来提供撤消。

【讨论】:

  • 我明白了。但如果你能告诉我任何现实生活中我必须不理会原始对象并使用对象的副本进行测试的实例,这将使我更清楚。
  • 我认为@biziclop 建议了一个您想要测试副本的场景。也就是说,您想测试复制是否成功,可能是在事务中。如果由于验证问题或数据库事务失败而导致复制失败,您可以直接将其丢弃并恢复到原始状态,而无需重新创建它。
  • 是的,我明白了。还有一件事,我读到我们在初始化一个对象时克隆一个对象太昂贵了所以,我们可以克隆一个现有的对象,而不是创建一个新的对象,并且只更改对我们的新实例重要的属性。请你抛出一些亮了吗?
  • @Anand,你得到答案了吗,与克隆相比,初始化和对象操作更昂贵吗?
【解决方案2】:

您经常希望使用不可变对象,在这种情况下,克隆是您代码的重要组成部分。例如,如果您有一个具有列表或数组类型字段的不可变对象,则您的 getter 应始终返回列表或数组的克隆以保持不变性。

另一个典型的用例是当您想要“事务性”修改时,当您调用多个状态更改方法但只希望在所有方法都成功时结果才可见。

【讨论】:

  • 正如你所说,将列表作为不可变对象的字段,我必须在 getter 中返回该列表的克隆,但我可以使用“new”创建一个新列表,然后返回它。还有List接口没有clone方法,只有实现类有clone方法。为什么要使用clone呢?
  • @anand 我的意思是克隆作为一般的操作。克隆的一种方法确实是使用复制构造函数。另一种是实现clone() 方法。如何实现克隆并不重要,一种方法与另一种方法一样好。
【解决方案3】:

克隆的一个具体例子是: prototype design pattern

【讨论】:

    【解决方案4】:

    正如克隆本身所说的复制某些东西,所以在 java 中,当我们说对象的克隆时,它意味着创建或拥有另一个与现有对象相同的对象。

    我们什么时候做克隆?当我们看到每次创建新对象都非常耗时,或者我们需要与所有已创建的对象具有相同或少量差异的新对象时,我们使用克隆。

    java中的克隆有3种类型

    • 浅拷贝
    • 深拷贝
    • 克隆

    浅拷贝

    浅拷贝是将对象的状态复制到另一个对象的过程,但两个对象都指向堆区的同一个引用。

    深拷贝

    在深拷贝中,创建了两个单独的对象并处于深拷贝中。在这种情况下,一个对象的每个字段都被复制到另一个对象。

    现在在java中克服这个困难的第三类是克隆的概念。

    克隆在java中是通过实现Cloneable接口来完成的。 Cloneable 是标记界面。

    更深入的克隆知识参考:Cloning in java

    【讨论】:

      【解决方案5】:

      您可以使用对象的深层克隆副本,因为您可能需要稍后使用的某些方法的部分结果。

      【讨论】:

        【解决方案6】:

        作为一种帮助保持封装(从而使您的代码更健壮)的方法,您可以在从 getter 返回对象之前克隆对象。例如,getDate 方法可能会在返回给调用者之前克隆一个日期字段。

        【讨论】:

        • 如你所说,我可以在返回之前克隆一个日期字段,但我也可以创建一个新的日期对象为什么要在这里使用克隆?
        猜你喜欢
        • 2018-01-05
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 2015-03-02
        相关资源
        最近更新 更多