一齐媒、前言
最近在翻看中間件源碼時(shí)候發(fā)現(xiàn)有些類實(shí)現(xiàn)了AutoCloseable接口纷跛,這個(gè)接口很生疏喻括,所以搜了下資料贫奠,學(xué)習(xí)了下,下面做個(gè)總結(jié)拷恨。
二、AutoCloseable接口由來
從AutoCloseable的注釋可知它的出現(xiàn)是為了更好的管理資源腕侄,準(zhǔn)確說是資源的釋放芦疏,當(dāng)一個(gè)資源類實(shí)現(xiàn)了該接口close方法,在使用try-catch-resources語法創(chuàng)建的資源拋出異常后眯分,JVM會(huì)自動(dòng)調(diào)用close 方法進(jìn)行資源釋放,當(dāng)沒有拋出異常正常退出try-block時(shí)候也會(huì)調(diào)用close方法弊决。像數(shù)據(jù)庫鏈接類Connection,io類InputStream或OutputStream都直接或者間接實(shí)現(xiàn)了該接口。
2.1 使用AutoCloseable之前資源管理方式
如上代碼創(chuàng)建了兩個(gè)資源与倡,在try-catch-finally的finally里面進(jìn)行手動(dòng)進(jìn)行資源釋放,釋放時(shí)候還需要進(jìn)行catch掉異常昆稿,這幾乎是經(jīng)典資源使用的方式,那么既然資源管理都是一個(gè)套路溉潭,那么為何不做到規(guī)范里面那少欺?所以AutoCloseable誕生了。
2.2 使用AutoCloseable進(jìn)行資源管理
如上圖使用jdk1.7新增的try-catch-resources語法在try的()內(nèi)部創(chuàng)建資源赞别,創(chuàng)建的資源在退出try-block時(shí)候會(huì)自動(dòng)調(diào)用該資源的close方法配乓。Resource實(shí)現(xiàn)了AutoCloseable的close方法:
運(yùn)行結(jié)果為:
把read函數(shù)里面注釋的拋異常代碼打開,運(yùn)行結(jié)果為:
so崎页,從運(yùn)行結(jié)果腰埂,總結(jié)如下幾點(diǎn)
- 使用try-catch-resources結(jié)構(gòu)無論是否拋出異常在try-block執(zhí)行完畢后都會(huì)調(diào)用資源的close方法。
- 使用try-catch-resources結(jié)構(gòu)創(chuàng)建多個(gè)資源盐固,try-block執(zhí)行完畢后調(diào)用的close方法的順序與創(chuàng)建資源順序相反
- 使用try-catch-resources結(jié)構(gòu),try-block塊拋出異常后先執(zhí)行所有資源(try的()中聲明的)的close方法然后在執(zhí)行catch里面的代碼然后才是finally.
- 只用在try的()中聲明的資源的close方法才會(huì)被調(diào)用志电,并且當(dāng)對(duì)象銷毀的時(shí)候close也不會(huì)被調(diào)用
- 使用try-catch-resources結(jié)構(gòu),無須顯示調(diào)用資源釋放挑辆。