2011-08-02 25 views
10

在Java中是否有一種優雅的方式來將所有現有的對象指針設置爲null? 我想要一個對象被刪除,但它在幾個地方註冊了一個Event Listener。如何刪除java中的所有對象指針

+1

爲什麼不直接刪除Event Listener? – emory

+0

是的,一種可能的解決方案是刪除所有EventListeners中的所有引用,當刪除一個對象時,使用[WeakReferences](http://download.oracle.com/javase/1,5.0/docs/api/java) /lang/ref/WeakReference.html),這將當對象設置爲null自我毀滅,更優雅 – Skip

回答

6

你可以看看References。如果您使用引用來引用類,那麼當所有常規引用都被刪除時,它不會阻止垃圾收集對象。當收集器確定要收集哪些對象時,Reference類所保留的參考不計算在內。當然,聽衆必須正確處理參考突然消失。而且只要你需要上課,你就必須確保一些東西保持一個常規的參考。

查看此主題以獲取關於軟參考和弱參考之間差異的討論。 What is the difference between a soft reference and a weak reference in Java?

+0

參考僅僅是所有引用類的公用超類型,我相信你的意思是在WeakReferences? – berry120

+0

這是典型的情況,但有理由使用其他兩個。 – sblundy

+0

完全同意,我只是想在這個問題的背景下WeakReference似乎是最合適的! – berry120

1

使用Java,你不能用引用來完成。您可以創建一個確定性Dispose方法清空像.NET的IDisposable的參考值。

4

不明確,沒有。這有一個很好的理由 - 這不是垃圾收集在Java中的工作方式!

如果你真的想這樣做(雖然我主要是爲了學術目的這麼說,但我強烈建議不要這麼做),我能想到的最好方法是可能將所有對象引用包含在WeakReferences中,並將其傳遞給周圍的人,只要保持對你的對象的一個​​強有力的引用。如果將該強引用設置爲null,那麼對該對象的所有弱引用都有資格進行垃圾回收。

當然,您需要注意的是,只要硬引用設置爲null,WeakReferences在隨後的任何時候都可以隨機消失。所以你需要確保你使用它們的代碼已經準備好處理它。

也就是說,這條路線幾乎不是最好的路線,並且會使您的代碼難以維護!確保它們全部被釋放,因爲它們很好地超出了範圍,這將是更好的選擇,如果其餘的代碼足夠整齊,不應該很難。

7

有沒有優雅的方式。不要試圖去做,否則你將最終難以維護代碼。

2

的幾個注意事項:

  1. 你無法控制的Java對象刪除。這是一個垃圾收集器的工作。你可以指示GC做垃圾收集,但這並不保證對象實際上會被刪除。

  2. 實際上,當物件無法到達時會被刪除。如果你刪除所有對它的引用,那麼你無法再訪問它。

+0

這就是爲什麼我要求刪除所有對象引用的方法 – Skip

+0

那麼你不能 - 這基本上是我的答案。您可以創建包裝類,以便在需要時檢索對象的引用,但是您必須確保使用此包裝器的代碼不會在內部存儲引用。 –