Javaでやってはいけないこと – finalizeメソッドを使う




データベース接続の解放など、終了処理(後始末)をいろいろと書きたいケースは多々あります。

Javaには、Objectクラスにfinalizeメソッドが用意されています。
一見、finalizeメソッドをオーバーライドして、終了処理を書いておけば良さそうですが、そうではありません。

finalizeメソッドをオーバーライドした処理は、とりあえず、“正常”にインスタンスが”ガーベージコレクションされるとき”に、(JVMがてきとーな努力をして)呼び出されます。
※仮に呼んでくれても、ガーベージコレクションされるときなので、すぐかもしれないし、翌日かもしれないし、とにかく期待できるタイミングではありません。

よって、finalizeメソッドをオーバーライドして書かれた処理は、処理が終わって、インスタンスが消えようとするとき(=いつか)に呼ばれるかもしれないし、呼ばれないかもしれませんw

つまるところ、finalizeメソッドをオーバーライドして、何らかの終了処理をするようなコードは、書いてはいけません。
処理が終わったときに、何かしたいのであれば、finally節を使いましょう♪

ダメな例

この例では、少なくともガーベージコレクションが走るまで、データベースとの接続は維持され続けます。
よって、他のスレッドで同様の処理があると、コネクションプールの取得で待ち続ける可能性があります。

修正例

finalizeメソッドをオーバーライドするのではなく、処理が終わったら、接続を解放するのが基本です。
また、例外等が発生しても接続を解放するように、finally節で実施すると確実です。