2013年にリリースされる予定のJavaSE8に入る内容を書いてます。Early Draft Review 2です。まだ変わるかもしれません。「違ったじゃん」と言われても知りません。……って注意書き要るかなぁ。
発端
「AutoCloseableを実装していないクラスにtry-with-resourcesを使うラッパ」が紹介されてた。で、Lambda後ならmethod referenceで出来そうだなと思ったわけです。
やってみた
こんなクラスがあって。
class Disposable { void dispose() { System.out.println("dispose!"); } }
こんな感じで。
public class Hoge { public static void main(String... args) throws Exception { Disposable obj = new Disposable(); try(AutoCloseable ac = obj::dispose) { System.out.println("try!"); } finally { System.out.println("finally!"); } } }
コンパイルして実行。
$ java8c Hoge.java $ ls Disposable.class Hoge.class Hoge.java $ java8 Hoge try! dispose! finally!
うん、できた。ごく普通。
感想
素直に出来てコード量もごく僅かで済んでます。
せっかくtry-with-resourcesでリソースの変数のスコープがtry内になってたんだけど、これをやろうと思うと変数をtryの外に出さなきゃいけない。でもそんな問題にもならないし、使えなくはなさそう……かな。