私は、Java 初心者の質問をたくさん読んできましたfinalize()
が、finalize() がリソースをクリーンアップするための信頼性の低い方法であることを誰も明確にしていないことに、少し戸惑っています。Connection をクリーンアップするためにそれを使用しているというコメントを見たことがありますが、Connection が閉じられていることを保証できる唯一の方法は try (catch) finally を実装することなので、これは本当に恐ろしいことです。
私はコンピューターサイエンスの教育を受けたことはありませんが、Java で 10 年近くプロとしてプログラミングをしてきましたが、finalize()
実稼働システムに Java を実装している人を見たことがありません。だからといって、Java に用途がないとか、一緒に働いた人たちが Java を正しく実装しているということではありません。
finalize()
そこで私の質問は、言語内の別のプロセスや構文を介してより確実に処理できない実装にはどのようなユースケースがあるかということです。
具体的なシナリオや経験を教えてください。Java のテキストブックを単に繰り返すだけでは不十分です。また、finalize の意図された使用法も不十分であり、この質問の意図ではありません。
ベストアンサー1
外部リソース (ソケット、ファイルなど) を保持するオブジェクトのバックストップとして使用できます。close()
メソッドを実装し、呼び出す必要があることを文書化します。
処理が実行されていないことが検出された場合に、処理をfinalize()
実行するように実装します。バグのある呼び出し元の後にクリーンアップしていることを示すために、何かをダンプする場合もあります。close()
stderr
try {} finally {}
例外的な状況やバグのある状況で追加の安全性を提供します。すべての呼び出し元が常に正しい処理を実行するわけではありません。残念ですが、ほとんどの環境で当てはまります。
めったに必要にならないことに同意します。また、コメント者が指摘しているように、GC オーバーヘッドが伴います。長時間実行されるアプリで「ベルトとサスペンダー」の安全性が必要な場合にのみ使用してください。
Java 9では、Object.finalize()
は非推奨です!彼らは私たちにjava.lang.ref.Cleaner
そしてjava.lang.ref.PhantomReference
代替として。