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();
   }
 }