インスパイヤ元はコチラ。
http://blogs.wankuma.com/nagise/archive/2007/08/01/88225.aspx
Javaで破棄処理を実装するときにはfinalizeをオーバーライドするのが流儀ですが、以下のコードは間違いです。
このコードの間違いに気づきますか?実は致命的な問題を含んでいます。
finalizeは主にリソースの解放などで利用されますが、これは解放忘れがあったときに、解放の為の最後のチャンスがGCによって与えられるわけです。上記実装では、Fooというクラスのリソースの解放を行っていますが、Barクラスがリソースをつかんでいた場合、一体だれがfinalizeを呼んでくれるのでしょうか。上記コードでは誰も呼んでくれません。オーバーライドされているため呼ばれないのです。ではどのように書くべきでしょうか。
上記例ではfinalizeメソッドを以下のように実装すべきです。
このように親クラスのfinalizeを呼びつつ、失敗しても必ず自身のリソース解放を行うのが正しい実装となります。