私は finalize() メソッドについて読んでいて、興味がありました:
ファイナライズでオブジェクトをクリーンアップする (それらを NULL に設定する) タスクと、メモリからオブジェクトを削除するタスクの違いは何ですか?
ファイナライズでオブジェクトをクリーンアップする(NULLに設定する)タスクの違いは何ですか
nullに設定すると、オブジェクトへの1 つの参照が削除されます。オブジェクトへの参照がこれ以上存在しない場合、ガベージコレクターはオブジェクトを削除できます (必須ではありません)。
メモリからオブジェクトを削除しますか?
Java でオブジェクトを削除 (破棄、削除) する明示的な方法はありません。ガベージコレクターは好きなときにそれを行います。特に、最後の参照を削除してからオブジェクトを削除/破棄するまでの時間は無期限です
finalizeメソッドでnullへの参照を設定する必要はありません。ガベージ コレクターの呼び出しがオブジェクトをファイナライズすると、その参照はとにかくすぐになくなります。
非常に長い Java 経験の中で、独自の finalize メソッドを作成したことはありません。
オブジェクトが os-resources を処理している場合、独自の finalize メソッドを作成することが理にかなっているまれなケースが発生します。ただし、一般に、OS アクセスには標準パッケージを使用します。
に設定したときにオブジェクトを「クリーンアップ」しませんnull
。参照を null に設定しているだけです。次のことを考慮してください。
Object a = new Object();
Object b = a;
a = null;
System.out.println(b);
オブジェクトがすべての参照を失うと、次の GC パスで収集されます。Finalize は、これが発生したときに呼び出されるメソッドであり、使用を避ける必要があります。
余分な参照を保持しないで、GC に任せてください。
finalize() は、オブジェクトの参照がなくなると、ガベージ コレクターによって呼び出されます。これをオーバーライドできます。ベスト プラクティスは、それを try-catch-finally ブロックで使用して、ファイルなどの Java 以外のリソースを解放することです。とにかく、このように使用する場合は、クラス階層のファイナライズを確実にするために super.finalize() も呼び出す必要があります。
このメソッドは常に高度な用途向けであり、通常のプロダクション コードでは使用しないでください。それらのリソースを使用するメソッドの finally 句でリソースを解放します。