Java循环引用,风格不好?

时间:2014-03-28 16:20:44

标签: java memory-management reference garbage-collection

我正在研究树结构,其中事件必须能够向下传播到根元素。同时我使用访问者模式来序列化这棵树。向访问者提供对根的引用,并向上移动树。

因此,我需要使用某种循环引用(对于孩子需要知道其父母的事件,父母需要知道所有孩子的访问者)。

class TreeNode {
    List<TreeNode> children;
    TreeNode parent;
    ...
}

我现在想要打破这些循环引用。释放根节点,应该自动释放树的其余部分。

我一直在试验parent字段的弱引用。我得到了空指针异常,因为java释放了事后由事件访问的父字段。

如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

Java垃圾收集足够聪明,不会被循环引用所欺骗。一旦没有对树的强引用,那么完整的循环引用树将全部被垃圾收集。

您需要做的就是确保树外没有任何引用到树内的任何地方。

如果某个事件正在访问父字段,则表明某些内容仍然存在引用。您需要清理它(无论是否删除循环引用)。