淺談Java中內部類引起的一個資源回收陷阱

來源:互聯網
上載者:User

內部類是Java語言中一個被廣泛使用的特性,但是,有時候使用不注意可能會引起一些資源回收的問題,請看下面的代碼:

public class JavaLeakTest {static List<Element> sList = new ArrayList<Element>();Element mData;public JavaLeakTest() {mData = new Element();}class Element{}static void addElement(){JavaLeakTest obj = new JavaLeakTest();sList.add(obj.mData);}}

 

可以看到,這段代碼裡的addElement方法每次都往sList中加入一個新的Element對象,Element是JavaLeakTest的內部類,

然後問題來了:在執行完addElement以後,JavaListTest obj所指向的對象會被銷毀嗎?

答案是否定的,因為被add到sList中的Element對象obj.mData實際上隱式地擁有一個對外部對象obj引用,只要sList依然保持對obj.mData的引用,obj就不會被回收!

 

但是如果Element是這樣定義的話:

static class Element{}

問題就不會出現

這種定義意味著Element對象中不保留對JavaLeakTest對象的引用,這將失去一些功能(例如在Element中直接存取JavaLeakTest的非靜態成員)。

所以,我們在使用內部類的時候,需要考慮到隱式引用引起的資源回收問題,同時需要結合需求進行取捨。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.