BT

Javaのファイナライゼーションは非推奨となるか?

| 作者: Ben Evans フォローする 31 人のフォロワー , 翻訳者 阪田 浩一 フォローする 1 人のフォロワー 投稿日 2017年4月3日. 推定読書時間: 2 分 |

原文(投稿日:2017/03/27)へのリンク

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

Relevance
Style
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT