日々常々

ふつうのプログラマがあたりまえにしたいこと。

AutoCloseableでなくてもtry-with-resourcesがしたい

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の外に出さなきゃいけない。でもそんな問題にもならないし、使えなくはなさそう……かな。