提问人:eeelll 提问时间:6/10/2021 更新时间:6/12/2021 访问量:721
如何在 Java 中使用 List 变量制作对象的深度副本?
How to make a deep copy of an object with a List variable in Java?
问:
我正在使用 Java,我想制作 MoleculeDTO 对象的深度副本。我也尝试制作一个复制构造函数,但它不起作用,它引用了初始对象。
public class MoleculeDTO {
private int ID;
private String name;
private List<AtomDTO> atoms = new ArrayList<>();
private int nrAtoms =0;
public MoleculeDTO(String name, List<AtomDTO> atoms, int nrAtoms) {
this.name = name;
this.atoms = atoms;
this.nrAtoms = nrAtoms;
}
public MoleculeDTO(MoleculeDTO molecule) {
this(molecule.getName(), molecule.getAtoms(), molecule.getNrAtoms());
}
...getter, setter
}
这里是 AtomDTO 类。
public class AtomDTO{
private int ID;
private String name;
private String symbol;
private int nrOfBonds;
private List<BondDTO> bonds = new ArrayList<>();
private int type;
private AnchorNode anchorNode;
public AtomDTO(String name, String symbol, int nrOfBonds, List<BondDTO> bonds, int type) {
this.name = name;
this.nrOfBonds = nrOfBonds;
this.bonds = bonds;
this.type = type;
}
public AtomDTO(AtomDTO copyAtom) {
this(copyAtom.getName(),copyAtom.getSymbol(), copyAtom.getNrOfBonds(), copyAtom.getBonds(), copyAtom.getType());
}
...getter, setter
}
这是 BondDTO 类。
public class BondDTO {
private int ID;
private int otherAtomID;
private int otherAtomType;
private int bondType;
public BondDTO(int otherAtomID, int otherAtomType, int bondType) {
this.otherAtomID = otherAtomID;
this.otherAtomType = otherAtomType;
this.bondType = bondType;
}
public BondDTO(BondDTO copyBond) {
this(copyBond.getOtherAtomID(), copyBond.otherAtomType, copyBond.bondType);
}
...getter, setter
}
答:
3赞
gdejohn
6/10/2021
#1
您的复制构造函数只是对每个字段进行浅层复制。这对字符串来说很好,因为它们是不可变的,而对于整数来说很好,因为它们是原始的(这意味着它们缺乏标识并且是不可变的)。在这些情况下,浅拷贝和深拷贝之间没有重要区别。但它通常不适用于列表,因为列表可以是可变的,它们的元素也可以是可变的。因此,您不仅需要指向同一个列表,还需要创建一个新列表并将原始列表的每个元素深度复制到新列表中。
使用此帮助程序方法制作任何列表的深度副本:
static <T> List<T> deepCopyList(List<T> list, UnaryOperator<T> deepCopyElement) {
return list.stream().map(deepCopyElement).collect(
Collectors.toCollection(ArrayList::new)
);
}
这样:
public AtomDTO(AtomDTO that) {
this(that.getName(), that.getType(), deepCopyList(that.getBonds(), BondDTO::new));
}
评论