try-with-resourcesと等価コード
try-with-resourcesの使い方を昨日初めて知りましたorz
残念なあまりバイトコードまで読んで等価のコードを読み取ってみたよ*1。
とりあえず
try (InputStream input = new FileInputStream("ファイル.txt")) { // 処理 }
な書き方ができるのがtry-with-resources
いままでは
InputStream input = new FileInputStream("ファイル.txt"); try { // 処理 } finally { input.close(); }
って書いてたね*2。
でもこの二つは等価じゃないみたい。
バイトコードから読み取った感じだと、
Throwable e1 = null; Throwable e2 = null; try { InputStream input = new FileInputStream("ファイル.txt"); try { // 処理 } catch (Throwable e) { e1 = e; throw e1; } finally { if (input != null) { input.close(); } } } catch (Throwable e) { e2 = e; if (e1 == null) { e1 = e2; } else { if (e1 == e2) { e1.addSuppressed(e2); } } throw e1; }
のような感じ。
#超厳密にいうと、変数宣言*3とtry catch finallyの範囲の指定*4がjavaコードから書くのはたぶん不可能だったりする。
基本的にバイトコードのほうが効率的になっている