如何创建我在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页)中也表示复制构造函数比克隆/克隆具有许多优势. >他们不依赖于风险倾向 如果你没有他的书,那就去吧! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |