我想在Java中編寫DagNode類,其中兩個節點在邏輯上相等,如果它們相等作爲參考。智能指針和參考計數在Java中
在C++ —的想法(我在C很++)—是使用智能指針和引用計數:
當創建一個節點,我會查找在如果某些表節點已經存在。如果是這樣,我會返回一個指向舊的指針。否則,重新創建一個節點。
重載的C++方法(如複製構造函數和析構函數)將執行參考計數,並且當節點的ref計數降至0時,該節點將從上述表中逐出。 (C++也將釋放內存。)
但是,似乎沒有辦法在Java中自動進行重新計數。我需要做ref-counting來知道何時從表中清除一個節點(以便它可以被垃圾收集),並且我真的希望避免在每個函數的開始和結束時調用node->incRef()
和node->decRef()
。
我們如何在Java中做這個C++習語?
Java中的引用計數不是自動的 - Java GC根本不依賴引用計數。 –
請允許我重複一遍以確保我能理解。基本上我有一個WeakReference的表格,而ReferenceQueue的意思是當它反正GC'd時從表格中驅逐WeakReference。在表中有一個WeakReference意味着它仍然可以GC'd,但是如果在堆棧或其他對象上有一個常規引用,那麼它不能被GC'd。 ReferenceQueue確保在垃圾收集之前從表中驅逐,所以一切都很好。 –
這是一個令人驚訝的優雅解決方案! Java並沒有讓我印象深刻。 –