見出し画像

Java 18から21の廃止予定機能

Javaの18から最新の21(2023年9月18日)のバージョンでは、多くの新機能が追加されましたが、廃止される機能もあります。今回は、主要な廃止予定機能と代替機能を確認していきます。

ファイナライズ(Finalize) の廃止


Java 18から21の期間で最大の変更は、ファイナライズの廃止です。この変更はJava 18のJEP 421で行われました。
ファイナライズはJava 1.0から存在していましたが、意図したようには機能していませんでした。理由はさまざまですが、興味がある方はJEPを参照してください。そこにはファイナライズが正しく機能しないことの実際の影響も記載されています。

ファイナライズの削除にアプリケーションを準備するにはいくつかの選択肢があります。
一つ目は、コマンドラインオプションの--finalization=disabledを使用してファイナライズを無効にすることです。これにより、JDK内のファイナライザーも含めて全てのファイナライザーが無効になります。アプリケーションに問題がなければ準備は完了です。

問題が発生した場合は、JDKフライトレコーダー(JFR) がjdk.FinalizerStatisticsイベントでfinalize()の呼び出しを追跡できるようになっています。以下のようにJFRを有効化できます。

$ java -XX:StartFlightRecording:filename=recording.jfr ...

jdk.FinalizerStatistics イベントは以下で出力できます。

jfr print --events FinalizerStatistics recording.jfr

これで変更が必要な箇所が分かります。
finalize() を削除する変更がコード内にある場合は、検討すべきオプションがいくつかあります。
コード内のfinalize()を変更する場合、CloseableやAutoCloseableを実装し、close()にリソース解放処理を移動することを検討してください。これにより try-with-resources ブロックから抜ける際にリソースが確実に開放されます。

try(MyCloseableResource res = new MyCloseableResource(){
	... 
}

これが機能しない場合は、JDK 9で追加された Cleaner API を検討してください。

ロケールの変更

Java 19 で java.util.Locale のコンストラクタがJDK-8282819により廃止予定となりました。代わりに静的ファクトリメソッドを使用する必要があります。

最も直接的な置き換えは.ofメソッドです。

  • Locale Locale.of(String)

  • Locale Locale.of(String, String)

  • Locale Locale.of(String, String, String)

他にも以下があります。

  • Locale Locale.forLanguageTag(String)

  • Locale.Builder

COMPATプロバイダの削除警告の出力 (JDK-8304982)

Java 9でLocaleデータのデフォルトがCOMPATからCLDRに変更されましたが、この変更はJEP 252でカバーされています。JDK-8304982では、COMPATが使用された場合に警告が出力されることが定義されています。COMPATの削除はJDK 22で実施される可能性があります。

JARインデックス機能の削除 (JDK-8302819)

JARインデックス機能はJDK 21で削除されました。この機能は主にアプレットの最適化のための古い機能で、アプレットも廃止予定です。 JARインデックス機能の代替はなく、-i や --generate-index が使用されると警告が出されるので気をつけましょう。

Java Inside より

次回の投稿では、Java21で追加された新機能について、紹介していきます!

私が通っているDEV.LAB(ディラボ)とは…
”一生使えるスキルを学ぶ”ことができる 未経験から現場での活躍を目指す
超実践OJT開発型をおこなっているプログラミングスクールです。
基礎的なJavaの知識から応用まで学ぶことができ、わからないことがあれば丁寧に教えてくれます。
Java × Springを現役エンジニアから学ぶことができ充実したサポートもあります。


この記事が気に入ったらサポートをしてみませんか?