加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何创建我在Java中创建的数据类型的副本?

发布时间:2020-12-15 05:04:20 所属栏目:Java 来源:网络整理
导读:如果我有课: public class MyType { private ListInteger data; private boolean someFlag; public MyType(ListInteger myData,boolean myFlag) { this.data = myData; this.myFlag = someFlag; } } 现在,如果我创建一个MyType实例,我该如何对其进行深层复
如果我有课:

public class MyType  
{  
    private List<Integer> data;  
    private boolean someFlag;

    public MyType(List<Integer> myData,boolean myFlag)
    {
        this.data = myData;
        this.myFlag = someFlag; 
    } 
}

现在,如果我创建一个MyType实例,我该如何对其进行深层复制呢?我不希望新对象指向旧引用,而是一个全新的实例.

这是我应该实现Cloneable接口的情况,还是用于浅拷贝?

我不能这样做:

MyType instance1 = new MyType(someData,false);  
MyType instance2 = new MyType(instance1.getData(),instance1.getFlag());

我担心MyType的新实例指向其“data”变量的相同引用.所以我需要完全复制它.

所以,如果我有一个现有的对象:

MyType someVar = new MyType(someList,false);

// Now,I want a copy of someVar,not another variable pointing to the same reference.

有人能指出我正确的方向吗?

解决方法

第一:您的代码示例有一些命名问题:是myFlag还是someFlag?

许多开发人员将弃用Cloneable,只需在需要深层副本时为类创建一个复制构造函数:

public class MyType {

   private boolean myFlag;
   private List<Integer> myList;

   public MyType(MyType myInstance) {
      myFlag = myInstance.myFlag;
      myList = new ArrayList<Integer>(myInstance.myList);  
   }
}

复制构造函数很常见,可以在许多集合实现中找到.出于清晰的原因,我更喜欢他们而不是实现Cloneable.同样值得注意的是,即使是强大的Joshua Bloch在Effective Java(第二版第61页)中也表示复制构造函数比克隆/克隆具有许多优势.

>他们不依赖于风险倾向
语外对象创造
机制
>他们不要求无法执行
坚持细记
公约
>他们不与正确的冲突
使用最终字段
>他们不会抛出不必要的检查
例外
>他们不需要演员阵容.

如果你没有他的书,那就去吧!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读