OpenJDKのcore-libs-devメールグループでの直近のメールでObject.finalize()メソッドを非推奨にする提案があった。
JavaのObject型にあるメソッドの非推奨は、非常にまれな手順となるだろう。finalize()メソッドはJava 1.0からずっとあり、仕様の欠陥でありプラットフォームにおける遺産で出来の悪いもの、そのかなりの部分として広く見なされている。
finalize()をオーバーライドしたオブジェクトはガベージコレクタによって特別に扱われる。通常、オブジェクトはスコープ外となった後コレクションサイクルの間ですぐに破棄される。しかし、ファイナライザブルなオブジェクトはそうではなくキューに移される。そこは、別のファイナライゼーションスレッドがキューから取り出し各オブジェクトのfinalize()メソッドを実行する。いったんfinalize()メソッドが終われば、オブジェクトはやっと次のサイクルでのガベージコレクションへの準備ができる。
このメカニズムの目的はJavaにC++のRAIIパターンに当たるものを提供することだ。そこではリソース(ファイルハンドルのような)はオブジェクトが生成されたときに補足され、オブジェクトが破棄された時に自動的に解放される。
しかしファイナライゼーションは自動リソース管理を安全に実装するわけではない。ガベージコレクタが実行タイミングに関する保証をしないからだ。これはリソースの解放とオブジェクトの生存期間を結びつけるメカニズムにおいては、何もないという意味だ。ゆえにつねにリソースが枯渇する可能性がある。
これではファイナライゼーションを使うことが元々実装された主な目的にフィットしていない。
長年オラクル(そしてサン)がした開発者へのアドバイスは、通常のアプリケーションコードではファイナライゼーションを避けるということだった。この非推奨は最終的な削除に対する最初のステップだった。しかしそれが実際に成したことはファイナライゼーションメカニズムが使われたときに正式なコンパイラ警告を導入することだけであった。
この機能の削除は実際にはまだスケジュールがない。一つにはプラットフォーム内でファイナライゼーションに対するユースケース、潜在的に乏しいリソースに結び付けられていないというケースがいくつかあるという理由である。こうしたケースを代替手段にどう移行するかに関して合意をこれから取る必要がある。
この非推奨の警告が本当にJava 9の一部として出荷されると仮定すると(可能性は高そうだが)、Java 10で削除されるというのが最も早いケースである。しかし、削除が本当に起こるのがこのリリースなのか、それとも後のリリースなのかははっきりしない。
Rate this Article
- Editor Review
- Chief Editor Action