Java 9以降、ついにCleaner
. ただし、ドキュメントでは具体的に宣言されています:
各クリーナーは独立して動作し、保留中のクリーニング アクションを管理し、クリーナーが使用されなくなったときにスレッド化と終了を処理します。
オブジェクト参照と対応するクリーニング アクションを登録すると、Cleanable が返されます。最も効率的な使い方は、オブジェクトが閉じられたとき、または不要になったときに明示的に clean メソッドを呼び出すことです。
クリーニング アクションは、明示的にクリーニングされていない限り、オブジェクトがファントムに到達可能になったときに最大 1 回呼び出される Runnable です。
クリーニング アクションは、登録されているオブジェクトを参照してはならないことに注意してください。その場合、オブジェクトはファントム到達可能にならず、クリーニング アクションは自動的に呼び出されません。
残念ながら、これはまさに私が必要とするものです: 登録したいアクションは、オブジェクト自体を参照する必要があります (通常はメソッドを呼び出すだけです)。
これは Cleaner では不可能に見えるため、Phantom または弱い/ソフト参照を使用してそれを行う方法はありますか?
私はそれらを見てみましたが、かなり複雑に見えるので、真剣に掘り下げる前に、このようなことが可能かどうかを事前に知りたいと思います.
Ps: どうやら、Phantom 参照が事後分析で実行されるようになったようです