7

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

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

4

6 回答 6

8

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

于 2012-04-08T18:09:17.807 回答
4

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

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

于 2012-04-08T18:14:07.883 回答
2

克隆的一个具体例子是: 原型设计模式

于 2012-04-08T18:17:24.677 回答
1

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

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

克隆在java中有3种类型

  • 浅拷贝
  • 深拷贝
  • 克隆

浅拷贝

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

深拷贝

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

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

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

有关克隆的更多深入知识,请参阅:Java 中的克隆

于 2017-11-11T14:47:47.713 回答
0

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

于 2012-04-08T18:12:37.760 回答
0

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

于 2012-04-08T18:15:49.757 回答