如何在没有stackoverflow的情况下链接两个节点?

时间:2017-10-12 20:31:52

标签: java methods

我试图将两个节点链接在一起。当n添加s作为链接时,s也应该更新以添加n作为链接。但是代码调用自身并陷入无限循环,然后溢出。如何让节点相互分配,但不能递归分配自己?

public class Node {
    Set<Node> connections = new HashSet<Node>();

    public static void main(String args[]) {
        Node n = new Node();
        Node s = new Node();
        n.addNode(s);
    }

    public Node() {

    }
    public void addNode(Node newNode) {
        connections.add(newNode);
        newNode.addNode(this);
    }
}

更新:我添加了此代码,让方法调用另一个setter方法。

   public void addNode(Node newNode) {
        connections.add(newNode);
        newNode.addSingleNode(this);
    }
    protected void addSingleNode(Node newNode) {
        connections.add(newNode);
    }
}

2 个答案:

答案 0 :(得分:4)

不要为此使用递归,并且您不会遇到问题。

public void addNode(Node newNode) {
    connections.add(newNode);
    newNode.connections.add(this);
}

即使connections是私有的,也允许这样做,因为对字段和方法的访问是基于每个类控制的,而不是基于每个对象的。

答案 1 :(得分:2)

您可以直接访问其他节点成员:

public void addNode(Node newNode) {
    connections.add(newNode);
    newNode.connections.add(this);
}

一种可以说是“更清洁”的方法是将这种“逻辑”封装在一个方法中:

private void addConnection(Node newConnection) {
    connections.add(newConnection);
}

public void addNode(Node newNode) {
    addConnection(newNode);
    newNode.addConnection(this);
}