我有一个Node对象,想从这个原始对象中创建一些克隆对象。下面是我的代码:
public class Main {
public static void main(String[] args) {
Node node = new Node();
node.setName("node1");
node.setValue("1");
node.setChildNodes(new ArrayList<>());
Node node2 = cloneNode(node);
Node childNode2 = new Node();
childNode2.setName("childNode2");
childNode2.setValue("1");
List<Node> childNodes2 = node2.getChildNodes();
childNodes2.add(childNode2);
node2.setChildNodes(childNodes2);
System.out.println(node.getChildNodes());
}
private static Node cloneNode(Node node) {
Node newNode = new Node();
newNode.setName(node.getName());
newNode.setValue(node.getValue());
newNode.setChildNodes(node.getChildNodes());
return newNode;
}
}
class Node {
private String name;
private String value;
private List<Node> childNodes;
//getter and setter
}
我创建了第一个节点,并创建了从第一个节点克隆的第二个节点。然后,我想修改第二个Node对象(node2)中的childNodes列表,然后我意识到也修改了第一个Node(node)中的childNodes列表。
如何避免第一个节点中的列表被修改?
非常感谢您!
答案 0 :(得分:2)
您所做的是一种shallow clone
。您可能需要更深的克隆,而不是
newNode.setChildNodes(node.getChildNodes())
您还应该克隆子节点。正确的方法是this
或者,您可以serialize
和deserialize
对象是克隆深层对象的简便方法
Eg:
只需将Node1
转换为JSON
字符串,然后将字符串转换回Node2
(提示:使用gson
库)