毎度おなじみ半年ぶりのJavaのアップデートです。
Java 24はLTSの1つ前のバージョンだからか、怒涛のJEP祭の様相を呈しています。
なんとJEPが24!!Standard JEPに限っても14もあります。こんなにJEPが多いのはJava 9以来はじめてです!
Java 24のJEPは以下の通り。
- 404: Generational Shenandoah (Experimental)
- 450: Compact Object Headers (Experimental)
- 472: Prepare to Restrict the Use of JNI
- 475: Late Barrier Expansion for G1
- 478: Key Derivation Function API (Preview)
- 479: Remove the Windows 32-bit x86 Port
- 483: Ahead-of-Time Class Loading & Linking
- 484: Class-File API
- 485: Stream Gatherers
- 486: Permanently Disable the Security Manager
- 487: Scoped Values (Fourth Preview)
- 488: Primitive Types in Patterns, instanceof, and switch (Second Preview)
- 489: Vector API (Ninth Incubator)
- 490: ZGC: Remove the Non-Generational Mode
- 491: Synchronize Virtual Threads without Pinning
- 492: Flexible Constructor Bodies (Third Preview)
- 493: Linking Run-Time Images without JMODs
- 494: Module Import Declarations (Second Preview)
- 495: Simple Source Files and Instance Main Methods (Fourth Preview)
- 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
- 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe
- 499: Structured Concurrency (Fourth Preview)
- 501: Deprecate the 32-bit x86 Port for Removal
こんなにJEPがあるのですが、なんとAPIの変更はとてもわずかしかないのです。
JEP 484 Class-File APIとJEP 485 Stream GatherersによるAPI追加以外はほとんどありません。
しかたないので、今回に限ってJEPを語るにしてしまいましょう。本エントリーではいつも通りJEPで語らない部分を紹介し、次のエントリーでJEPについて紹介していきます。
なお、java.baseモジュール以外だと、java.desktopモジュールに変更がありますが、変更点が少ないので省略します。また、いつも通り、セキュリティ関連も省略します。
廃止になったAPI
Java 24で削除されたAPIは2つだけです。いずれもフィールドです。
フィールド
削除されたフィールドはすでに削除された機能に関連しているフィールドです。
- java.awt.Window.warningString
- javax.naming.Context.APPLET
1つ目のWindowクラスのwarningStringはpublicなフィールドではありません。
この文字列はgetWarningString()メソッドで返される文字列でした。セキュリティマネージャで設定されるパーミッションが設定されている場合はnullが返るようになっていたのですが、セキュリティマネージャが廃止されたため、常にnullを返すようになっています。
このため、getWarningString()メソッドで返す文字列が必要なくなったため、削除されました。
2つ目のContextクラスのAPPLETは、まぁしかたないですね。APPLETはなくなってしまいましたし。
廃止予定に追加されたAPI
Java 24では3つのクラスと2つのメソッドが廃止予定に追加されました。
クラス
- java.awt.AWTPermission
- java.util.zip.ZipError
- javax.sound.sampled.AudioPermission
AWTPermissionクラスとAudioPermissionクラスはWindow.warningStringと同様にセキュリティマネージャが削除されたためです。
ZipError例外はエラー出ないZipExcpeion例外があるので、もはや使われていない例外のため削除予定です。
メソッド
- java.awt.Window.getWarningString()
- java.swing.JInternalString.getWarningString()
どちらもセキュリティマネージャが削除されたためで、現状はnullを返すだけになっています。
追加/変更されたAPI
いつもの通り、Preview JEPに関するAPI変更はここでは省略します。また、セキュリティ関連も省略します。
java.base/java.ioパッケージ
JEP 495で導入予定のjava.io.IOクラスに関連してConsoleクラスに2つのメソッドが追加されました。Java 23でもメソッドが追加されていましたが、追加の追加という感じ。
IOクラス自身はプレビューなので、Starndard JEPになったら説明します。まぁ、大したことではないんですけどね。
Consoleクラス
Consoleクラスには2つのメソッドが追加されました。
- Console println()
- Console readln()
printlnメソッドは改行を出力で、readlinメソッドは1行読み込みです。
いずれも引数があるオーバーロードがJava 23で導入されていたので、おまけのような感じ。
とはいっても、Java 23とJava 24で追加されたメソッド群はまだPreviewなので、使うには--enable-previewオプションが必要です。
Readerクラス
Readerクラスにファクトリメソッドが追加されました。
Reader/Writerクラスはアブストラクトクラスで、基本的にはデコレーターパターンで機能を付け加えるという使い方をしていました。しかし、ファクトリーメソッドができたということは、今後Readerクラスの使い方が変わるかもしれません。
- static Reader of(CharSequence cs)
ofメソッドでは、引数で指定したCharSequenceオブジェクトから読み込んでいくReaderオブジェクトを生成します。
動作としては、StringReaderクラスとほぼ同じです。
java.base/java.langパッケージ
Java 24は2024年にリリースされたUnicode 16.0をサポートしました。これに対応して、文字関連のAPIが追加されています。
Charater.UnicodeBlockクラス
Unicode 16.0では新たに絵文字が追加されたり、ヒエログリフが追加されたことが話題になりましたね。
これに応じて、UncodeBlockクラスでは新たに10のブロックに対応する定数が追加されています。
- static final UnicodeBlock EGYPTIAN_HIEROGLYPHS_EXTENDED_A
- static final UnicodeBlock GARAY
- static final UnicodeBlock GURUNG_KHEMA
- static final UnicodeBlock KIRAT_RAI
- static final UnicodeBlock MYANMAR_EXTENDED_C
- static final UnicodeBlock OL_ONAL
- static final UnicodeBlock SUNUWAR
- static final UnicodeBlock SYMBOLS_FOR_LEGACY_COMPUTING_SUPPLEMENT
- static final UnicodeBlock TODHRI
- static final UnicodeBlock TULU_TIGALARI
Charater.UnicodeScript列挙型
UncodeScript列挙型でもUnicode 16.0に対応するため、新たに7つの定数が追加されています。
- GARAY
- GURUNG_KHEMA
- KIRAT_RAI
- OL_ONAL
- SUNUWAR
- TODHRI
- TULU_TIGALARI
Processクラス
メソッドが1つだけオーバーロードされました。
- boolean waitFor(java.time.Duration duration)
waitForメソッドはプロセスの終了を待つというメソッドです。
Java 23までは引数なしで終了を待つものと、タイムアウトをlongとTimeUnit列挙型で指定する2つのオーバーロードがありました。
Java 24では、これらに加えてタイムアウトをDate & Time APIのDurationクラスで指定するものが加わっています。
java.base/java.lang.classfileパッケージ
java.lang.classfileパッケージとそのサブパッケージはJEP 484 Class-File APIで使用するパッケージです。
簡単な紹介は次回の「JEPで語る」でしますが、詳細な説明は「バイトコード入門」の続編として書く予定です。
java.base/java.lang.reflectパッケージ
java.lang.reflectパッケージはいつも通り新しいバージョンに合わせた定数が追加されています。
ClassFileFormatVersion列挙型
いつものように、Java 24に対応する定数が追加されました。
- RELEASE_24
java.base/java.util.streamパッケージ
JEP 485 Stream Gatherersによって、インタフェースとクラスが追加されています。
Gathererインタフェース
中間操作のためのインタフェースが追加されました。Gathererインタフェースを使うと、終端操作のCollectorインタフェース相当の機能が中間操作で実現できます。
Gatherersクラス
Gathererインタフェース用のユーティリティクラスです。
Stream Gathererの使い方は、本ブログの Stream Gatherer 基礎編 を参照してください。
Streamインタフェース
StreamインタフェースにはGathererを使うためのメソッドが追加されました。
- <R> Stream<R> gather(Gatherer<? super T, ?, R> gatherer)
Stream Gathererの使い方は、本ブログの Stream Gatherer 基礎編 を参照してください。
おわりに
なんとAPIの変更はこれだけ!!
追加されたAPIとしては、Class-File APIがあるのでむちゃくちゃ多いのですが、それ以外はほんのわずか。Java 24はAPIの変更よりも、次のLTSのために不要な実装を削除するなどの整理が主になっている感じです。
また、プリミティブ型のパターンマッチングなどの文法の変更も次のLTSでStandard JEPになることが予想されます。
さて、次のエントリーではJEPに関して簡単な説明を加えていきます。