用Java克隆后如何避免传递对象?

时间:2019-03-11 14:48:52

标签: java

我有一个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列表。

如何避免第一个节点中的列表被修改?

非常感谢您!

1 个答案:

答案 0 :(得分:2)

您所做的是一种shallow clone。您可能需要更深的克隆,而不是

newNode.setChildNodes(node.getChildNodes())

您还应该克隆子节点。正确的方法是this

或者,您可以serializedeserialize对象是克隆深层对象的简便方法

Eg:只需将Node1转换为JSON字符串,然后将字符串转换回Node2(提示:使用gson库)