淺談AutoCloseable接口

轉自:http://ifeve.com/%e6%b5%85%e8%b0%88autocloseable%e6%8e%a5%e5%8f%a3/

淺談AutoCloseable接口

1、前言

最近在翻看源碼時候發現有些類實現了AutoCloseable接口,這個接口很生疏,因此搜了下資料,學習了下,下面作個總結。數據庫

 

2、AutoCloseable接口由來

從AutoCloseable的註釋可知它的出現是爲了更好的管理資源,準確說是資源的釋放,當一個資源類實現了該接口close方法,在使用try-catch-resources語法建立的資源拋出異常後,JVM會自動調用close 方法進行資源釋放,當沒有拋出異常正常退出try-block時候也會調用close方法。像數據庫連接類Connection,io類InputStream或OutputStream都直接或者間接實現了該接口。函數

2.1 使用AutoCloseable以前資源管理方式

image.png學習

如上代碼建立了兩個資源,在try-catch-finally的finally裏面進行手動進行資源釋放,釋放時候還須要進行catch掉異常,這幾乎是經典資源使用的方式,那麼既然資源管理都是一個套路,那麼爲什麼不作到規範裏面那?因此AutoCloseable誕生了。spa

2.2 使用AutoCloseable進行資源管理

image.png對象

如上圖使用jdk1.7新增的try-catch-resources語法在try的()內部建立資源,建立的資源在退出try-block時候會自動調用該資源的close方法。Resource實現了AutoCloseable的close方法:接口

image.png資源

運行結果爲:get

image.png源碼

把read函數裏面註釋的拋異常代碼打開,運行結果爲:io

image.png

so,從運行結果,總結以下幾點

  • 使用try-catch-resources結構不管是否拋出異常在try-block執行完畢後都會調用資源的close方法。
  • 使用try-catch-resources結構建立多個資源,try-block執行完畢後調用的close方法的順序與建立資源順序相反
  • 使用try-catch-resources結構,try-block塊拋出異常後先執行全部資源(try的()中聲明的)的close方法而後在執行catch裏面的代碼而後纔是finally.
  • 只用在try的()中聲明的資源的close方法纔會被調用,而且當對象銷燬的時候close也不會被調用
  • 使用try-catch-resources結構,無須顯示調用資源釋放。
相關文章
相關標籤/搜索