オブジェクトへの強力なルート参照がなくなると、オブジェクトは存在しなくなります。ほとんどの場合、それはまさに起こるべきことです。ただし、場合によっては、オブジェクトは、そのサービスが不要になったことを他のエンティティに知らせるという約束と引き換えに、外部のエンティティに何かを依頼することがあります。たとえば、「ファイル」オブジェクトは、ファイルへの排他的アクセスを OS に要求する場合があります。そのようなアクセスが不要になったと OS に通知されるまで、他のすべてのユーザーがそのファイルを使用する能力をブロックします。
そのような約束をしたオブジェクトが放棄され、単に存在しなくなった場合、外部エンティティは、その行動がもはや何の利益にもならないにもかかわらず、他のすべての人に損害を与えるために、求められたことは何でもやり続けるでしょう。誰でも。この状況を回避するために、Java はオブジェクトが放棄されたように見えることに GC が気付いたときにオブジェクトが通知を要求できるようにします。このような通知はFinalize
、オブジェクトが存在しなくなる前に行われます (つまり、そのようなオブジェクトに対して呼び出されます) が、それ以降の適時性についての実際の保証はありません。ファイナライズされたオブジェクトは、その代わりに動作するすべてのエンティティに、その動作を停止する必要があることを通知できます。
Java の作成者は、オブジェクトが外部エンティティにサービスが不要になったことを通知できる主要なメカニズムとしてファイナライザーを期待していたかもしれませんが、ファイナライズは実際にはうまく機能しません。多くの場合、AutoCloseable
またはなどの他のメカニズムの方が優れています。PhantomReference