2
0

More than 1 year has passed since last update.

JEP 421: Deprecate Finalization for Removal

Last updated at Posted at 2022-02-01

動向キャッチアップ出来てなかったので纏め。

概要

  • タイトル通り、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に依存してる箇所の確認方法などを想定。
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0