リソースをクリーンアップするためのclose()メソッドを使用してリソースクラスを作成し、誰かがclose()の呼び出しを忘れた場合に、finalize()をオーバーライドしてリソースを解放(および警告を出力)したいとします。どうすればこれを適切に行うことができますか?
- ネイティブ(JNI割り当て)リソースにのみ推奨されますか?
- ファイナライザーから、ファイナライズされた別のオブジェクトへの参照を使用するとどうなりますか?循環依存関係がある場合、ガベージコレクターが、ファイナライザーが実行された可能性のあるオブジェクトへのアクセスをどのように防ぐことができるかわかりません。
- リソースリークを検出および/または処理するためにfinalize()をオーバーライドするためのより良い代替手段はありますか?
- ファイナライザーを実装するときに注意すべき他の落とし穴はありますか?
注:finalize()を使用することは通常悪い考えであり、呼び出されることが保証されていないことを私は知っています。これについて議論する他のいくつかの質問があります。この質問は、Javaでファイナライザーを実装する方法に関するものであり、なぜすべきか(またはすべきでないか)についてではありません。