2014-06-18 36 views
3

我有一個包含JComponents的容器,如JButtonJSlider擁有監聽器(onClick,onValueChanged ...)。有時集裝箱內容將被container.removeAll()刪除並重新填充JComponents。組件的偵聽器包含對持久對象實例的引用。組件#removeAll()是否清理已刪除控件的觀察者/監聽者?

我的問題是現在,GC是否清除舊組件的偵聽器,那些舊組件被刪除?

回答

2

這取決於。這些組件可能會從其他地方引用(甚至可能來自監聽器本身)。如果添加了監聽器,以至於沒有其他引用,則組件可能會被GCed,但是,代碼中的其他位置仍可能存在對這些組件的其他引用。

總之,沒有辦法告訴組件是否會在沒有分析代碼的情況下得到GC。獲得一個想法組件是否得到GCed與否,

一種方法是使用PhantomReference S(參見PhantomReference
爲了檢查,查詢您作爲參數傳遞給PhantomReference引用隊列。

+1

好的,謝謝。我調試了一下,也發現,在removeAll()後,聽衆在我的情況下變成了GCed。我總是使用'WeakReferences'例如與Observers一起使用,我不知道有'PhantomReference's。我會閱讀有關它,謝謝! – alex