在Java中是否有一種優雅的方式來將所有現有的對象指針設置爲null? 我想要一個對象被刪除,但它在幾個地方註冊了一個Event Listener。如何刪除java中的所有對象指針
回答
你可以看看References。如果您使用引用來引用類,那麼當所有常規引用都被刪除時,它不會阻止垃圾收集對象。當收集器確定要收集哪些對象時,Reference
類所保留的參考不計算在內。當然,聽衆必須正確處理參考突然消失。而且只要你需要上課,你就必須確保一些東西保持一個常規的參考。
查看此主題以獲取關於軟參考和弱參考之間差異的討論。 What is the difference between a soft reference and a weak reference in Java?
使用Java,你不能用引用來完成。您可以創建一個確定性Dispose
方法清空像.NET的IDisposable
的參考值。
不明確,沒有。這有一個很好的理由 - 這不是垃圾收集在Java中的工作方式!
如果你真的想這樣做(雖然我主要是爲了學術目的這麼說,但我強烈建議不要這麼做),我能想到的最好方法是可能將所有對象引用包含在WeakReferences中,並將其傳遞給周圍的人,只要保持對你的對象的一個強有力的引用。如果將該強引用設置爲null,那麼對該對象的所有弱引用都有資格進行垃圾回收。
當然,您需要注意的是,只要硬引用設置爲null,WeakReferences在隨後的任何時候都可以隨機消失。所以你需要確保你使用它們的代碼已經準備好處理它。
也就是說,這條路線幾乎不是最好的路線,並且會使您的代碼難以維護!確保它們全部被釋放,因爲它們很好地超出了範圍,這將是更好的選擇,如果其餘的代碼足夠整齊,不應該很難。
有沒有優雅的方式。不要試圖去做,否則你將最終難以維護代碼。
的幾個注意事項:
你無法控制的Java對象刪除。這是一個垃圾收集器的工作。你可以指示GC做垃圾收集,但這並不保證對象實際上會被刪除。
實際上,當物件無法到達時會被刪除。如果你刪除所有對它的引用,那麼你無法再訪問它。
這就是爲什麼我要求刪除所有對象引用的方法 – Skip
那麼你不能 - 這基本上是我的答案。您可以創建包裝類,以便在需要時檢索對象的引用,但是您必須確保使用此包裝器的代碼不會在內部存儲引用。 –
- 1. 刪除所有指向java中的對象的指針
- 2. 如何從boost :: ptr_vector中刪除指針而不刪除對象?
- 3. 刪除指針向量中的指針指向的對象
- 4. C++的shared_ptr如何刪除指針對象有多個shared_ptr的
- 5. 刪除指針數組的指針指向對象
- 6. ObjectListView - 如何刪除所有對象
- 7. 通過指針檢測對象刪除
- 8. 刪除對象經由指針
- 9. 刪除兩個指針引用的對象指針
- 10. 如何刪除指針指針?
- 11. 如何刪除具有指針成員的類的指針?
- 12. 刪除指針的指針
- 13. 刪除指針數組而不刪除內存中的指向對象?
- 14. 刪除Parse.com中的所有舊對象
- 15. 如何刪除指針只有一次?
- 16. 如何刪除多對多而不刪除關係中的所有對象?
- 17. 刪除Java中的對象
- 18. 如何從解析中的指針數組中刪除指針?
- 19. 刪除指針和使用已刪除對象
- 20. 刪除存儲指向某些對象的指針的數組
- 21. 在Rails中,如何刪除數組中的所有對象?
- 22. 如何從three.js中刪除場景中的所有Mesh對象?
- 23. 如何從R中的工作區中刪除所有對象?
- 24. 從UIView中刪除所有對象
- 25. 指針和Java對象
- 26. 如何刪除一個指針數組中的元素的java
- 27. 刪除指向Derived對象的基指針
- 28. 調用刪除兩個指向同一對象的指針
- 29. 刪除智能指針指向的對象
- 30. 刪除存儲在列表中的對象的空指針?
爲什麼不直接刪除Event Listener? – emory
是的,一種可能的解決方案是刪除所有EventListeners中的所有引用,當刪除一個對象時,使用[WeakReferences](http://download.oracle.com/javase/1,5.0/docs/api/java) /lang/ref/WeakReference.html),這將當對象設置爲null自我毀滅,更優雅 – Skip