首页 > Java > 有没有办法创建一个新的副本并将其分配给?dumtwo = dumdumdumtwo

有没有办法创建一个新的副本并将其分配给?dumtwo = dumdumdumtwo

上一篇 下一篇

请考虑以下代码:

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'

所以,我想复制到并更改,而不会影响.但是上面的代码没有这样做。当我在 中更改某些内容时,也会发生相同的更改。dumdumtwodumdumtwodumdumtwo

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

分割线

网友回答:

基本:Java 中的对象复制。

让我们假设一个对象 – ,它包含两个对象,containedObj1 和 containedObj2obj1

浅拷贝:
浅拷贝创建同一类的新字段,并将所有字段复制到新实例并返回。Object 类提供了一种方法,并为浅表复制提供支持。instanceclone

Deep copying:
A deep copy occurs when an object is copied along with the objects to which it refers. Below image shows after a deep copy has been performed on it. Not only has obj1 been copied, but the objects contained within it have been copied as well. We can use to make a deep copy. Unfortunately, this approach has some problems too(detailed examples).obj1Java Object Serialization

可能的问题:
很难正确实施。
最好使用防御性复制、复制构造函数(如@egaga回复)或静态工厂方法。clone

  1. 如果你有一个对象,你知道有一个公共方法,但在编译时你不知道对象的类型,那么你就有问题了。Java有一个名为.在实践中,如果我们想实现这个接口 对象 . 受到保护,因此我们必须使用公共方法覆盖它才能访问它。clone()CloneableCloneableObject.clone
  2. 当我们尝试对复杂对象进行深度复制时,会出现另一个问题。假设所有成员对象变量的方法也做深度复制,这是一个风险太大的假设。您必须控制所有类中的代码。clone()

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

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

分割线

网友回答:

创建复制构造函数:

class DummyBean {
  private String dummy;

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

每个对象还有一个克隆方法,可用于复制对象,但不使用它。创建类并执行不正确的克隆方法太容易了。如果你要这样做,至少阅读Joshua Bloch在Effective Java中对它的看法。

分割线

网友回答:

在包中有一个方法:import org.apache.commons.lang.SerializationUtils;

SerializationUtils.clone(Object);

例:

this.myObjectCloned = SerializationUtils.clone(this.object);

模板简介:该模板名称为【有没有办法创建一个新的副本并将其分配给?dumtwo = dumdumdumtwo】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 246次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-21
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信文章 html5 微信图片 微信模板 微信公众平台 响应式 单页式简历模板 企业网站 自适应 微信素材
您可能会喜欢的其他模板