これは主に好奇心からです。
デバッグ/ロギング/プロファイリングの目的を除いて、誰かが Object.finalize() の適切な使用法に遭遇したかどうか、私はさまよっていましたか?
遭遇したことがない場合、良い使い方は何だと思いますか?
これは主に好奇心からです。
デバッグ/ロギング/プロファイリングの目的を除いて、誰かが Object.finalize() の適切な使用法に遭遇したかどうか、私はさまよっていましたか?
遭遇したことがない場合、良い使い方は何だと思いますか?
Java オブジェクトが JNI を使用してネイティブ コードにネイティブ メモリの割り当てを指示する場合は、ファイナライズを使用して確実に解放する必要があります。
ここでのパーティーに遅れましたが、私はまだチャイムを鳴らすと思っていました:
私が見つけたファイナライザーの最良の使用法の 1 つは、何らかの理由で呼び出されなかった明示的な終了メソッドを呼び出すことです。これが発生した場合、これはバグであるため、問題もログに記録します。
なぜなら:
これにより、大きなリスクなしに対処できるタスクはほんの一握りになります。
しかし、使用されるのは単なるフォールバックであり、「通常の」メカニズムは機能しませんでした。通常のメカニズムは明示的に開始する必要があります。
通常は手動で解放する必要があるのに、何らかの理由で解放されなかったリソースを解放します。おそらく、ログに警告を書き込みます。
データベースにバックアップされたオブジェクトをキャッシュするためにソフト参照を使用するときに、データベースにデータを書き戻すために使用します。
私は finalize() の 1 つの良い使い方を見つけました: 大量に利用可能で、排他的ではないリソースを解放します。
たとえば、デフォルトでは、Linux プロセスでは 1024 個、Windows では約 10000 個のファイル ハンドルが使用できます。これはほとんどの場合、ファイルを開く場合、ほとんどのアプリケーションで .close() を呼び出す必要はありません (そして醜い try...finally ブロックを使用します)。しばらくしてから解放してください。ただし、一部のコード (集中的なサーバー アプリケーションなど) では、.close() を使用してリソースを解放する必要があります。そうしないと、finally() の呼び出しが遅すぎて、ファイル ハンドルが不足する可能性があります。
同じ手法が Swing でも使用されています。ウィンドウと描画を表示するオペレーティング システムのリソースは、.close() メソッドでは解放されず、finalize() によってのみ解放されるため、すべての .close() またはたとえば、SWT のような .dispose() メソッド。
ただし、リソースの数が非常に限られている場合、またはリソースを使用するためにリソースを「ロック」する必要がある場合は、リソースを「ロック解除」することも忘れないでください。たとえば、ファイルにファイルロックを作成する場合は、このロックも削除することを忘れないでください。そうしないと、他の誰もこのファイルを読み書きできなくなり、デッドロックが発生する可能性があります。このロックは、適切な場所で手動で行う必要があります。