gpt4 book ai didi

java - 在 Java 中复制构造函数而不是 Clone

转载 作者:行者123 更新时间:2023-11-29 06:51:45 25 4
gpt4 key购买 nike

我正在尝试在 java 中实现一个复制构造函数。我面临着类的非原始类型字段的问题。在创建新副本时,它正在共享成员。例如

public class Bad implements Cloneable {
private ArrayList<Integer> a;
private Object c;

public static void main(String[] args) {
Bad b1 = new Bad();
b1.a.add(10);

System.out.println(b1.a);
Bad b2 = b1.clone();
b2.a.add(12);

System.out.println(b1.a);
}

Bad() {
a = new ArrayList<>();
c = null;
}

Bad(Bad b) {
a = b.a;
c = b.c;
}

public Bad clone() {
return new Bad(this);
}
}

结果是:

[10]
[10, 12]

我不希望这样的事情发生。以此为例。我的原始问题包含更多用户定义的字段。
或者有没有图书馆可以帮我完成这项工作?提前致谢。

最佳答案

复制构造函数的简单规则:

  • 原始值可以按原样复制;它们只是没有独立身份的值(value)观
  • 对不可变类型的引用(例如字符串、整数、任何枚举类常量)也可以按原样复制;尽管原始对象和复制对象将共享相同的引用,但引用的对象是不可变的,永远不会改变
  • 对可变类型的引用(例如 Date、ArrayList、任何数组)必须复制到该类型的新实例;否则原始对象和复制对象将共享对同一可变字段对象的引用(这不是您想要的)

制作仅包含具有原始和不可变值的字段的对象的副本是简单模式。

复制其字段包含可变对象的对象可能会使过程变得艰巨且昂贵,具体取决于可变对象的复杂程度(想象一个包含 Map 的 ArrayList,其值也是 Maps)。但是,如果您希望拥有一份安全的副本,则必须制作一份新的可变字段副本。

关于java - 在 Java 中复制构造函数而不是 Clone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983738/

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