差異處
這裏顯示兩個版本的差異處。
下次修改 | 前次修改 | ||
java:effective_java:creating_and_destroying_objects:prefer_try-with-resources_to_try-finally [2019/07/28 22:15] tony 建立 |
java:effective_java:creating_and_destroying_objects:prefer_try-with-resources_to_try-finally [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== Prefer try-with-resources to try-finally ====== | + | {{tag>java effective_java}} |
+ | ====== Effective Java - Prefer try-with-resources to try-finally ====== | ||
+ | ===== Introduction & My Opinion ===== | ||
+ | 在Java7以前,針對需要特別close的資源,會寫程式的人基本上都會放在finally的block中: | ||
+ | <code java> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | 這個item要強調的是,在Java7之後,使用try-with-resources會讓你的程式碼更精簡: | ||
+ | <code java> | ||
+ | try( InputStream is = new FileInputStream(mConfigFilePath) ){ | ||
+ | mProp.load(is); | ||
+ | } catch (IOException e) { | ||
+ | // need to handle .. | ||
+ | } | ||
+ | </code> | ||
+ | 針對使用的說明,我之前已有[[java:basic:exception:try-with-resource|文章]]做分享。這種寫法除了讓你程式碼更精簡外,以上述例子來說,如果load與close都發生例外,是可以透過Exception的getSuppressed去取得這兩個Exception的callstack。\\ | ||
+ | \\ | ||
+ | 這種寫法也可以應用在stream的close,甚至可以做自己的AutoClose的Lock物件,避免忘記呼叫unlock的情況。 | ||
+ | ===== Note ===== | ||
+ | Effective Java第三版Item 9。 | ||
+ | ===== Reference ===== | ||
+ | * Effective Java, 3/e | ||
+ | ===== ===== | ||
+ | ---- | ||
+ | \\ | ||
+ | ~~DISQUS~~ |