正しいファイナライザの記述方法

ついでにJavaでの正しいファイナライザの記述方法を紹介しておく*1


スーパークラスのファイナライザも呼び出す必要がある。

@Override
protected void finalize() throws Thowable {
    try {
        // ファイナライザの中身
    } finally {
        super.finalize();
    }
}


finalでないクラスでは、ファイナライザをオーバーライドされ、自分のファイナライザが呼び出されない恐れがあるため、自分のファイナライザを必ず呼び出すように、以下のファイナライザガーディアンと呼ばれるイディオムを使用するといい。

private final Object obj = new Object() {
    @Override
    protected void finalize() throws Throwable {
       // ファイナライザの中身
    }
};

*1:Effective Javaの項目6、「ファイナライザを避ける」より