2014-03-28 26 views
1

我正在研究樹狀結構,其中事件必須能夠傳播到根元素。同時我使用訪問者模式來序列化這棵樹。訪問者提供了一個對根的引用,並向上傳播。Java循環引用,壞風格?

因此,我需要使用某種循環引用(對於孩子需要知道其父母的事件,父母需要知道所有孩子的訪問者)。

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

我現在想分解這些循環引用。釋放根節點,應該自動釋放整個樹的其餘部分。

我一直在試驗parent這個字段的弱引用。我得到了空指針異常,因爲java釋放了之後被事件訪問的父字段。

如何解決這個問題?

+3

你確定你確實有問題嗎?如果沒有人持有對樹的任何元素的引用,Java將很樂意循環收集。你的數據結構意味着任何TreeNode都會使整個樹留在內存中,但爲什麼你認爲這是一個問題? –

+0

按照慣例,只有樹葉和根是從外部引用的。基本上我到現在還沒有經歷過任何記憶問題。我只是不知道java能夠清理那些繼續引用自己的「內存島」。 – gorootde

回答

4

Java垃圾收集足夠智能,不會被循環引用所愚弄。只要沒有對樹的強引用,那麼帶有循環引用的整個樹都將被垃圾收集。

所有您需要做的就是確保沒有從樹之外的引用到樹中的任何位置。

如果某個事件正在訪問父字段,則表明某事仍有參考。你需要清理它(不管你是否刪除循環引用)。