どうしてfinalizeを使うべきではないのですか？


「Javaのfinalizeによるクリーンアップ処理の実装は行うべきではない」と教わったのですが、なぜそうなのでしょう？  
また、finalizeを使わずに同じようなことをすることはできるのでしょうか？




コメントで教えていただいたところにとても良く書いてあったので、自分でまとめます。

finalizeはいつ呼ばれるかわからないし、呼ばれないかもしれない。JVMの実装にも依存するのでコードの可搬性が失われる。また、finalizeはファイナライズスレッドで実行されるが、ここで例外が発生してもエラーにはならず、オブジェクトが中途半端な状態でメモリに残る可能性がある。  
だから、そんな不安定な処理に依存する処理は書くべきではない。

