2012-09-14 53 views
7

我想在Java中編寫DagNode類,其中兩個節點在邏輯上相等,如果它們相等作爲參考。智能指針和參考計數在Java中

在C++ —的想法(我在C很++)—是使用智能指針和引用計數:

  • 當創建一個節點,我會查找在如果某些表節點已經存在。如果是這樣,我會返回一個指向舊的指針。否則,重新創建一個節點。

  • 重載的C++方法(如複製構造函數和析構函數)將執行參考計數,並且當節點的ref計數降至0時,該節點將從上述表中逐出。 (C++也將釋放內存。)

但是,似乎沒有辦法在Java中自動進行重新計數。我需要做ref-counting來知道何時從表中清除一個節點(以便它可以被垃圾收集),並且我真的希望避免在每個函數的開始和結束時調用node->incRef()node->decRef()

我們如何在Java中做這個C++習語?

回答

6

在Java中,參考調查和垃圾是自動的。

但這並不意味着它完全隱藏。

你似乎需要ReferenceQueue,如果你想知道什麼時候一個對象可以garbaged,也許WeakReference如果你想保持不阻止垃圾指針。

我建議你看看java.lang.ref package的描述,以找到你需要的最佳解決方案。

+3

Java中的引用計數不是自動的 - Java GC根本不依賴引用計數。 –

+0

請允許我重複一遍以確保我能理解。基本上我有一個WeakReference的表格,而ReferenceQueue的意思是當它反正GC'd時從表格中驅逐WeakReference。在表中有一個WeakReference意味着它仍然可以GC'd,但是如果在堆棧或其他對象上有一個常規引用​​,那麼它不能被GC'd。 ReferenceQueue確保在垃圾收集之前從表中驅逐,所以一切都很好。 –

+0

這是一個令人驚訝的優雅解決方案! Java並沒有讓我印象深刻。 –

2

創建節點時,如果該節點已經存在,則在某個表中查找,如果只是返回指向舊節點的指針,則返回新節點。

使在Java中這種查詢機制並不難。只需使用一個工廠方法,它會檢查一個'表'並返回該實例(如果它已經存在)。

我需要的引用計數,所以我知道什麼時候才能驅逐從表中的一個節點(因此它可以被垃圾收集)

對於Java有WeakReference類。它不允許你做引用計數,但允許對象在沒有人引用它時進行GC編輯。

結合這些2和可以

  • 構造填充WeakReference小號
  • 使用一個 '表',它使用WeakReference秒(例如WeakHashmap
可用的Java Collection實施方式的一個