Java、リソースの開放漏れを検出する
動機
明示的にclose()しないと嫌なことが起こるオブジェクトがあって、当然close()するように書くんですけど漏れがあると心配。せめてリソースの開放漏れがあったら警告するようにしたい。
対象
外部リソースを扱う自作クラス。proxy classと組み合わせれば既存のクラスに適用することも可能だけど。
説明
リソース開放漏れチェックを行うクラスを作りました。アサーションが有効(オプション-eaが指定されてる)な場合、開放が漏れてたらSystem.errに警告を出します。
コード
サンプル
class UnmanagedResource { public UnmanagedResource() { this.handle=OuterSystem.getResource(); // リソースの初期化が行われたタイミングでインスタンス作成 checker=ResourceLeakChecker.create(getClass()); } private final int handle; private final ResourceLeakChecker checker; public void close() { OuterSystem.releaseResource(handle); // リソースが開放されたらsetClosedで通知。 // setClosed()が呼ばれないでGCされた場合に警告メッセージが出ます checker.setClosed(); } }