C#にはUsingという仕組みがあるし、Java7なら既にtry-with-resourcesが導入されている。
しかし、何らかの理由でJava6を使い続けないといけないような場合でも、安全に簡単にリソースを解放させる方法はないかと考えて、最終的にはライブラリとして使えるようにまとめてみた。
しかし、何らかの理由でJava6を使い続けないといけないような場合でも、安全に簡単にリソースを解放させる方法はないかと考えて、最終的にはライブラリとして使えるようにまとめてみた。
作成中によしおりさんのProc.retryの記事を見てしまい、参照させてもらったので、最終的な構造がよく似ている。
JUnitのメソッド名に日本語が使えるのは知っていたけど、やり方がわからなかったので大変勉強になった。
JUnitのメソッド名に日本語が使えるのは知っていたけど、やり方がわからなかったので大変勉強になった。
使い方
生成したCloseableなインスタンス(例えばStream等)をregisterに登録しておくと、runメソッドを実行後にcloseを実行する。
Using.execute(new Runnable() {
@Override
public void run() throws IOException {
XxxOutputStream os = new XxxOutputStream();
register(os);
XxxInputStream is = new XxxInputStream();
register(is);
...
}
});
@Override
public void run() throws IOException {
XxxOutputStream os = new XxxOutputStream();
register(os);
XxxInputStream is = new XxxInputStream();
register(is);
...
}
});
発生した例外を参照したい場合には、次のような書き方をすれば取得できる。
戻り値が配列になっているのは、例外が複数回発生した場合にも対応できるようにするため。
例えば、runメソッド内で例外が発生した後にclose処理でも例外が発生、複数のclose処理で例外が発生する等を想定している。
戻り値が配列になっているのは、例外が複数回発生した場合にも対応できるようにするため。
例えば、runメソッド内で例外が発生した後にclose処理でも例外が発生、複数のclose処理で例外が発生する等を想定している。
IOException[] exceptions = Using.execute(new Runnable() {
...
});
...
});
参照
思考実験の過程は以下。
「アイディア その1」なんかはそのまま使えるかも...。
「アイディア その1」なんかはそのまま使えるかも...。