gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:44 24 4
gpt4 key购买 nike

如果我有一个类:

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 接口(interface),还是用于浅拷贝?

我不能只做:

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

我担心 MyType 的新实例指向其“数据”变量的相同引用。所以我需要完整地复制它。

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

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);
}
}

复制构造函数很常见,可以在许多 Collections 实现中找到。出于清晰的原因,我更喜欢它们而不是实现 Cloneable 。同样值得注意的是,即使是强大的约书亚布洛赫也在 Effective Java 中说(第二版第 61 页)复制构造函数比 Cloneable/clone 有很多优点。

  • 他们不依赖于有风险的语言之外的对象创建机制
  • 他们不要求无法执行遵守薄薄的记录惯例
  • 它们不与适当的冲突最终字段的使用
  • 他们不会抛出不必要的检查异常(exception)情况
  • 他们不需要转换。

如果您没有他的书,请获取!

关于java - 如何创建我在 Java 中创建的数据类型的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com