動向キャッチアップ出来てなかったので纏め。
概要
- タイトル通り、Finalizationを廃止する為に前準備するJEP。
- Java 1.0から存在してるprotected void finalize()を廃止。
- Finalizationに対する指摘自体は1998年から挙がってた、とのこと。
- Finalizationの問題点は、JEP本文ご参照。
- 経緯も纏まっていて非常に勉強になった。
- JDK18時点ではデフォルト有効で変わらず。
- 移行先は、try-with-resources(Java7以降)および、Cleaners(Java9以降)を想定。
今後(JEP421で整備する範囲)
- 以下などfinalize()メソッドをDeprecated勧告。
java.lang.Object.finalize()
java.lang.Enum.finalize()
java.util.concurrent.ThreadPoolExecutor.finalize()
//GUIアプリ関連
java.awt.Graphics.finalize()
java.awt.PrintJob.finalize()
//イメージ操作関連
javax.imageio.spi.ServiceRegistry.finalize()
javax.imageio.stream.FileCacheImageInputStream.finalize()
javax.imageio.stream.FileImageInputStream.finalize()
javax.imageio.stream.FileImageOutputStream.finalize()
javax.imageio.stream.ImageInputStreamImpl.finalize()
javax.imageio.stream.MemoryCacheImageInputStream.finalize()
- CommandLineオプションを追加。
- Finalization無効にする(=GCによるFinalization実行計画をスキップする)フラグ追加。
- JDK18時点ではデフォルト有効。
今後(JEP421より未来の話 2022/2/1現時点)
-
Finalizationをデフォルト無効にする。
--finalization=enabledで有効に切り替えられるように整える予定。 -
実行時には警告を出す予定。
-
更に将来では、Finalizationの機構自体を削除。
-
長めに移行期間を設けてメンテ作業できるように整える予定。
- JDK自体がFinalization多用してるので対応。
- 著名なライブラリ群も多用してるのでメンテ支援。Netty, Log4j, Guava, Apache Commonsなど。
- 開発者向け移行ガイドを提供。Finalizationに依存してる箇所の確認方法などを想定。