我正在研究树结构,其中事件必须能够向下传播到根元素。同时我使用访问者模式来序列化这棵树。向访问者提供对根的引用,并向上移动树。
因此,我需要使用某种循环引用(对于孩子需要知道其父母的事件,父母需要知道所有孩子的访问者)。
class TreeNode {
List<TreeNode> children;
TreeNode parent;
...
}
我现在想要打破这些循环引用。释放根节点,应该自动释放树的其余部分。
我一直在试验parent
字段的弱引用。我得到了空指针异常,因为java释放了事后由事件访问的父字段。
如何解决这个问题?
答案 0 :(得分:4)
Java垃圾收集足够聪明,不会被循环引用所欺骗。一旦没有对树的强引用,那么完整的循环引用树将全部被垃圾收集。
您需要做的就是确保树外没有任何引用到树内的任何地方。
如果某个事件正在访问父字段,则表明某些内容仍然存在引用。您需要清理它(无论是否删除循环引用)。