« TraChat - Tracにチャット機能を追加するプラグイン(WebSocket使用) | メイン | AndroidのWebView#addJavascriptInterfaceがどれだけ危険か検証してみた »

開いたStreamを安全に閉じる仕組みを作ってみた(Java6向け)

C#にはUsingという仕組みがあるし、Java7なら既にtry-with-resourcesが導入されている。
しかし、何らかの理由でJava6を使い続けないといけないような場合でも、安全に簡単にリソースを解放させる方法はないかと考えて、最終的にはライブラリとして使えるようにまとめてみた。
作成中によしおりさんのProc.retryの記事を見てしまい、参照させてもらったので、最終的な構造がよく似ている。
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);
        ...
    }
});
発生した例外を参照したい場合には、次のような書き方をすれば取得できる。
戻り値が配列になっているのは、例外が複数回発生した場合にも対応できるようにするため。
例えば、runメソッド内で例外が発生した後にclose処理でも例外が発生、複数のclose処理で例外が発生する等を想定している。
IOException[] exceptions = Using.execute(new Runnable() {
    ...
});
参照
思考実験の過程は以下。
「アイディア その1」なんかはそのまま使えるかも...。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド