如何在 Java 中复制对象?

新手上路,请多包涵

考虑下面的代码:

 DummyBean dum = new DummyBean();
dum.setDummy("foo");
System.out.println(dum.getDummy()); // prints 'foo'

DummyBean dumtwo = dum;
System.out.println(dumtwo.getDummy()); // prints 'foo'

dum.setDummy("bar");
System.out.println(dumtwo.getDummy()); // prints 'bar' but it should print 'foo'

So, I want to copy the dum to dumtwo and change dum without affecting the dumtwo .但是上面的代码并没有这样做。当我更改 dum 中的内容时,同样的更改也发生在 dumtwo 中。

我想,当我说 dumtwo = dum 时,Java 只复制引用。那么,有没有办法创建 dum 的新副本并将其分配给 dumtwo

原文由 Veera 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
2 个回答

创建复制构造函数:

 class DummyBean {
  private String dummy;

  public DummyBean(DummyBean another) {
    this.dummy = another.dummy; // you can access
  }
}

每个对象还有一个克隆方法,可以用来复制对象,但不要使用它。创建一个类并执行不正确的克隆方法太容易了。如果您打算这样做,请至少阅读 _Effective Java_ 中 Joshua Bloch 所说的内容。

原文由 egaga 发布,翻译遵循 CC BY-SA 2.5 许可协议

基础: Java 中的对象复制。

让我们假设一个对象 obj1 包含两个对象, containedObj1containedObj2

在此处输入图像描述

浅拷贝:

浅复制创建一个新的 instance 同一个类并将所有字段复制到新实例并返回它。 对象类 提供了 clone 方法并提供了对浅拷贝的支持。

在此处输入图像描述

深度复制:

一个对象与其所引用的对象一起被复制 时,就会发生深拷贝。下图显示 obj1 在对其执行深度复制之后。 不仅复制了 obj1 ,而且其中包含的对象也被复制了。我们可以使用 Java Object Serialization 进行深拷贝。不幸的是,这种方法也有一些问题( 详细示例)。

在此处输入图像描述

可能出现的问题:

clone 很难正确实施。

最好使用 防御性复制复制构造函数(如@egaga 回复)或 静态工厂方法

  1. 如果你有一个对象,你知道它有一个 public clone() 方法,但你不知道编译时对象的类型,那么你就有问题了。 Java 有一个名为 Cloneable 的接口。实际上,如果我们想创建一个对象 Cloneable ,我们应该实现这个接口。 Object.clone受保护 的,因此我们必须使用公共方法 重写 它以便可以访问它。

  2. 当我们尝试对 复杂对象 进行 深度复制 时会出现另一个问题。假设所有成员对象变量的 clone() 方法也做深拷贝,这个假设风险太大。您必须控制所有类中的代码。

例如 org.apache.commons.lang.SerializationUtils 将具有使用序列化进行深度克隆的方法( 来源)。如果我们需要克隆 Bean,那么 org.apache.commons.beanutils ( Source ) 中有几个实用方法。

  • cloneBean 将根据可用的属性 getter 和 setter 克隆一个 bean,即使 bean 类本身没有实现 Cloneable。
  • copyProperties 对于属性名称相同的所有情况,会将属性值从源 bean 复制到目标 bean。

原文由 Chandra Sekhar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题