2017-10-12 85 views
2

我试图让两个节点链接在一起。当n作为链接添加s时,s也应更新为添加n作为链接。但代码自行调用并陷入无限循环,然后溢出。我怎样才能让节点相互分配,但不能递归地分配自己?如何在没有stackoverflow的情况下链接两个节点?

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); 
    } 
} 
+1

随着更新你的问题似乎**解决**。还是有问题吗? – Zabuza

+0

一切顺利,不得不等待暂停。 –

+0

啊好的。刚刚被你编辑的问题弄糊涂了。通常情况下,您不会通过编辑在解决方案中包含解决方案。因此,我认为你有一个后续问题。 – Zabuza

回答

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); 
} 
+0

直接方式或使用“更清洁”方式的任何理由有什么缺点? –

+2

不利的方面是**混乱**,更多的方法可能会混淆你的代码。但是有很多优点:您现在可以轻松插入日志记录,错误检查或将来的修改。您甚至可以完全交换内部数据结构,但对该方法的调用将保持不变。 – Zabuza

+1

@AlexG由于'addConnection'是私人的,它主要是风格问题。如果你将它保护起来,就有一个参数可以让你扩展'Node'类并允许不同的扩展类以不同的方式实现它。 – Mureinik

5

不要为此使用递归,而且你也不会有问题。

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

这是允许的,即使connections是私有的,因为访问字段和方法是在每个阶级基础,不是每个对象为基础的控制。

+0

所以,我意识到这一点,并考虑过这样做,但我很担心,因为这意味着连接被直接修改,没有错误检查。使用受保护的方法来设置它会更好吗?我会在一秒后发布一个修改。 –

+1

您可以将任何错误添加到您喜欢的方法中。 –

+1

有趣。没有意识到'私人'的指定仍然允许这个工作。清楚的是,你是说对象A和对象B都可以修改对方的私有变量,如果它们是相同的类型?凉。 –

相关问题