在Java7以前,針對需要特別close的資源,會寫程式的人基本上都會放在finally的block中:
private void close(Closeable closable){ try { if( closable != null ) closable.close(); } catch (IOException e) { // log } } private void load(){ mProp = new Properties(); InputStream is = null; try { is = new FileInputStream(mConfigFilePath); mProp.load(is ); } catch (IOException e) { // need to handle .. } finally { close(is); } }
這個item要強調的是,在Java7之後,使用try-with-resources會讓你的程式碼更精簡:
try( InputStream is = new FileInputStream(mConfigFilePath) ){ mProp.load(is); } catch (IOException e) { // need to handle .. }
針對使用的說明,我之前已有文章做分享。這種寫法除了讓你程式碼更精簡外,以上述例子來說,如果load與close都發生例外,是可以透過Exception的getSuppressed去取得這兩個Exception的callstack。
這種寫法也可以應用在stream的close,甚至可以做自己的AutoClose的Lock物件,避免忘記呼叫unlock的情況。
Reference:
- Effective Java, 3/e, Item 9。
留言
張貼留言