我正在研究树结构,其中事件必须能够向下传播到根元素。同时我使用访问者模式来序列化这棵树。向访问者提供对根的引用,并沿着树向上移动。
因此我需要使用某种循环引用(对于事件, child 需要知道其 parent ,对于访问者, parent 需要知道所有 child )。
class TreeNode {
List<TreeNode> children;
TreeNode parent;
...
}
我现在想分解这些循环引用。释放根节点,应该会自动释放整个树的其余部分。
我一直在试验 parent
字段的弱引用。我遇到了空指针异常,因为 java 释放了父字段,该字段随后被事件访问。
如何解决?
最佳答案
Java 垃圾回收足够聪明,不会被循环引用所愚弄。一旦没有对树的强引用,那么整个包含循环引用的树都将被垃圾收集。
您需要做的就是确保没有从树外部到树内部任何地方的引用。
如果事件正在访问父字段,则表明某些内容仍然具有引用。您将需要清理它(无论您是否删除循环引用)。
关于Java循环引用,糟糕的风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22718123/