原文はこちら。
The original article was written by Sharat Chander (Director, Java SE Product Management, Oracle).
https://blogs.oracle.com/java/post/the-arrival-of-java-23
JDK 23 is now available!
Oracleは開発者、企業、およびエンドユーザー向けにJDK 23の一般提供を開始したことを発表します。
New with Java 23
JDK 23では、8個のプレビュー機能と1個のインキュベーター機能を含む、JDK Enhancement Proposals (JEP) に値するほど重要な12の機能強化が行われています。これらの範囲は、Java言語、API、パフォーマンス、およびJDKに含まれるツールの改善にまでおよびます。
JDK 23
https://openjdk.org/projects/jdk/23/
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.org/jeps/1
Javaプラットフォームでの作業に加えて、Oracle JDK 23では、Oracle GraalVM JITコンパイラ(Graal JIT)がOracle JDKの一部として利用可能なJITコンパイラに追加されました。詳細は以下のブログエントリをご覧ください。
Including the Graal JIT in Oracle JDK 23
https://blogs.oracle.com/java/post/including-the-graal-jit-in-oracle-jdk-23
Language Improvements:
Primitive Types in Patterns, instanceof, and switch (Preview) – JEP 455
この変更により、パターン・マッチングでプリミティブ型を使用する際のいくつかの制限が緩和されました。特別な許可が必要なく、両方の型が同じ方法で処理できる場合、プリミティブ型とオブジェクト型を処理するコードを簡素化できます。instanceofがプリミティブ型を受け入れることで、条件付きのキャスト(値がターゲットの型に対して有効であることを確認する必要がある)を自動的に処理できるようになり、一般的なケースのコードをさらに削減できます。
Module Import Declarations (Preview) – JEP 476
1ステートメントでモジュールがエクスポートするすべてのパッケージをインポートできるようになりました。これにより、インポートするコードをモジュール自体に含める必要がなくなり、モジュールライブラリの再利用が簡素化されます。この機能により、初心者でもサードパーティライブラリや基本的なJavaクラスを、パッケージ階層内の位置を学習しなくても使用できるようになりました。
Implicitly Declared Classes and Instance Main Methods (Third Preview) – JEP 477
これにより、初心者がより大規模で複雑なプログラム向けの機能を理解しなくても、最初のJavaプログラムを書くことができるようになりました。シンプルなプログラムでは簡素化された宣言を使用でき、必要に応じて、より高度な機能を使用するようにシームレスに拡張できます。経験豊富な開発者も、簡潔に小さなプログラムを記述できます。
Flexible Constructor Bodies (Second Preview) – JEP 482
コンストラクタ内で明示的なコンストラクタ呼び出し(すなわち、super(..)またはthis(..))の前にいくつかのステートメントを記述できるようにすることで、コンストラクタの動作をより適切に表現する自由を得ることができるようになりました。この機能により、ロジックをより自然な位置に配置できるため、一部のチェックおよび初期化ロジックを補助的な静的メソッドや補助的な中間コンストラクタに分割する必要がなくなります。例えば、コンストラクタがスーパークラスのコンストラクタを呼び出す前に受け取った引数を検証できる場合、引数が無効な場合はすぐに失敗し、スーパークラスの不要なインスタンス化を回避できます。
Libraries
Class-File API (Second Preview) – JEP 466
この JEPでは、Java仮想マシン仕様で定義されたフォーマットを追跡するJavaクラスファイルの解析、生成、変換を行うAPIを提案しています。
Chapter 4. The class File Format
https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-4.html
このAPIが各機能リリースに組み込まれることで、Javaが6か月ごとのリリースサイクルを採用し、リリースごとに更新されるクラスファイルを操作するフレームワークが新しいバージョンの急速な採用を余儀なくされたときに生じた緊張が緩和されるでしょう。この機能が最終決定されれば、JDK自体がサードパーティのASMライブラリへの依存から解放されるはずです。
Vector API (Eighth Incubator) – JEP 469
Java開発者が、サポート対象のCPUアーキテクチャ上で、実行時に最適なベクトル命令に確実にコンパイルされるベクトル計算を表現できるようにし、同等のスカラー計算よりも優れたパフォーマンスを実現します。この機能は、JDK 22での7回目のインキュベーションと違いはありません。このAPIは、Project Valhallaから必要な機能が利用可能になるまで、軽微な変更のみでインキュベーションとして継続される見込みです。
Stream Gatherers (Second Preview) – JEP 473
Stream APIを拡張し、カスタムの中間操作をサポートします。これにより、ストリーム・パイプラインで、既存の組み込みの中間操作では容易に達成できない方法でデータを変換できるようになります。stream gathererは、コレクタが末端操作で実現するのと同等の柔軟性を中間操作にもたらします。この拡張機能では、5つの組み込みgathererを導入します。
Package java.util.stream
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/stream/package-summary.html
Structured Concurrency (Third Preview) – JEP 480
structured concurrency(構造化並行処理)により、開発者は異なるスレッドで実行される関連タスクのグループを単一の作業単位として扱うことができるため、エラー処理とキャンセルの効率化、信頼性の向上、および可視性の強化が可能になります。このAPIは、キャンセルやシャットダウンに起因する一般的なリスク(スレッドリークやキャンセルの遅延など)を排除できる並行プログラミングのスタイルを促進します。
Scoped Values (Third Preview) – JEP 481
このJEPは、メソッドがスレッド内の呼び出し先と子スレッドの両方でImmutableなデータを共有できるようにするものです。scoped valueは、スレッドローカル変数よりも簡単に推論できます。 また、virtual threads(JEP 444)や構造化並行処理(JEP 480)と併用した場合、特に、スペースと時間のコストが低くなります。
JEP 444: Virtual Threads
https://openjdk.org/jeps/444
JEP 480: Structured Concurrency (Third Preview)
https://openjdk.org/jeps/480
Performance
ZGC: Generational Mode by Default – JEP 474
ZGC(Z Garbage Collector)のデフォルトのモードを世代別モードに切り替えます。JDK 21で導入された世代別ZGCの使用に関するフィードバックや社内でのテストにより、ほとんどのユースケースにおいて非世代別ZGCよりも大幅にパフォーマンスが向上することが確認されています。このJEPでは、将来のJDKリリースで世代別ZGCモードを廃止する予定であるため、非世代別ZGCモードも廃止されます。
Tooling
Markdown Document Comments – JEP 467
Javadocドキュメントコメントを記述する際に、HTMLとJavadocの@タグの混合ではなく、Markdownを使用できるようにします。新しい形式により、ソース形式のドキュメントが読みやすく理解しやすくなります。
Stewardship
Deprecate the Memory-Access Methods in sun.misc.unsafe for Removal – JEP 471
JDK 9(JEP 260)でほとんどの内部 API へのアクセスが制限され、JDK 16(JEP 396)でさらに制限された後、JDK 17(JEP 403)でサポートされていない内部 API の一部が利用可能な状態のまま残されました。これは、サポートされている API が利用できないタスクに広く使用されていたためです。当初の目標は、最終的にそれらのタスクに対してサポート付きのAPIを提供し、その後、それらのサポートされていない内部APIへのアクセスを制限することでした。JDK 22で外部関数および外部メモリAPI(JEP 454)が導入されたことで、オフヒープ(外部)メモリに効率的にアクセスするためのサポート付きAPIが提供されました。そのため、外部メモリアクセスに使用されるsun.misc.unsafeのメソッドを将来的に削除することを発表します。
JEP 260: Encapsulate Most Internal APIs
https://openjdk.org/jeps/260
JEP 396: Strongly Encapsulate JDK Internals by Default
https://openjdk.org/jeps/396
JEP 403: Strongly Encapsulate JDK Internals
https://openjdk.org/jeps/403
JEP 454: Foreign Function & Memory API
https://openjdk.org/jeps/454
A reminder on Preview and Incubator features
プレビュー機能は、Java SEプラットフォームの言語機能またはVM機能として完全に仕様化され、完全に実装されたものですが、まだ一時的なもの(つまり固まっていない)です。これらは、将来のリリースで恒久的なものになる前に、実際の使用に基づく開発者のフィードバックを可能にするために、JDKフィーチャーリリースで利用可能になっています。これにより、ツールベンダーは、Java SE Standardに最終化される前に、機能のサポートに取り組むことができます。
インキュベータ・モジュールのAPIは、最終化されていないAPIとツールを開発者とユーザーの手に渡し、最終的にJavaプラットフォームの品質を向上させるフィードバックを収集することを目的としています。
JEP 11: Incubator Modules
https://openjdk.org/jeps/11
Other changes
JEPで説明されている変更以外にも、リリースノートに記載されている多くの小さな更新があり、多くのアプリケーション開発者やシステム管理者が関心を持っていることでしょう。これらには、廃止されたAPIの非推奨化や、以前に非推奨となったAPIの削除などが含まれます。
JDK 23 Release Notes
https://jdk.java.net/23/release-notes
Java 22リリースノートから、主要なアップデートを一部ご紹介しましょう。
Console Methods With Explicit Locale (JDK-8330276)
java.util.Locale引数を取る以下のメソッドがjava.io.Consoleクラスに追加されました。
public Console format(Locale locale, String format, Object ... args)public Console printf(Locale locale, String format, Object ... args)public String readLine(Locale locale, String format, Object ... args)public char[] readPassword(Locale locale, String format, Object ... args)
これを使えば、指定したロケール(デフォルトロケールと異なる場合もあります)でフォーマット済み文字列を出力したり、プロンプトテキストを表示したりできるようになります。例えば、次のコードスニペット
System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date());
は、次のように表示されます。
2024-mai-16 jeudi
# new Date()で2024年9月18日が返ってくるとすれば...
2024-septembre-18 mercredi
Add jdk.SerializationMisdeclaration JFR Event (JDK-8275338)
新たなJFRイベントのjdk.SerializationMisdeclarationは、シリアライズ関連のフィールドやメソッドの宣言が不適切な場合に、実行時に発生します。 jdk.SerializationMisdeclarationを有効にすると、シリアライズ可能なクラスがJVMにロードされた際に、そのクラス内の宣言が不適切な各要素についてJFRイベントが呼び出されます。
例えば、SerializableクラスのwriteObject()メソッドが正しいシグネチャを持つにもかかわらず、意図せずにpublicとして宣言されている場合、シリアライズ機構はそのメソッドを選択しません。これは、そのクラスの開発者にとっては意外な結果でしょう。このような問題を診断するためには、jdk.SerializationMisdeclarationイベントを有効にする必要があります。
標準のdefault.jfcプロファイルではこれらのイベントは有効になっていませんが、標準のprofile.jfcプロファイルでは有効になっています。
Support for Duration Until Another Instant (JDK-8331202)
java.time.Instantクラスに、指定されたInstantまでの期間を取得する新しいメソッドが追加されました。新しいメソッド:Instant.until(Instant)は、Duration.between(Temporal, Temporal)と同じ期間を生成しますが、ユーザーがより発見しやすくなっています。 この新しいメソッドは、単位変換をせずに直接Durationを返すため、Instant.until(Temporal, TemporalUnit)メソッドよりも便利です。
Thread and Timestamp Options for java.security.debug System Property (JDK-8051959)
すべてのコンポーネントや特定のコンポーネント向けにステートメントのデバッグをするため、システムプロパティjava.security.debugはスレッドID、スレッド名、呼び出し元の情報、タイムスタンプ情報を追加する引数を受け付けるようになりました。
+timestampをデバッグオプションに追加すると、そのデバッグオプションのタイムスタンプが出力されます。+threadをデバッグオプションに追加すると、そのデバッグオプションのスレッドおよび呼び出し元情報が出力されます。以下はその例です。
-Djava.security.debug=all+timestamp+thread | タイムスタンプとスレッド情報を、生成されるすべてのデバッグ文に追加 |
-Djava.security.debug=properties+timestamp | プロパティ・コンポーネントに対して生成されるすべてのデバッグ文にタイムスタンプ情報を追加 |
-Djava.security.debug=help | サポートされるコンポーネントと引数の完全なリストを表示 |
Enable Case-Sensitive Check in ccache and keytab Kerberos Entry Lookup (JDK-8331975)
Kerberosプリンシパルのkeytabまたは認証情報キャッシュ(ccache)エントリを検索する際、プリンシパル名は大文字と小文字を区別せずにエントリ名と比較します。
しかし、多くのKerberos実装では、プリンシパル名の大文字と小文字が区別されます。そのため、2つのプリンシパル名の大文字と小文字が異なるだけであれば、誤ったkeytabまたはccacheエントリが選択されるリスクがあります。
名前の比較を制御するために、jdk.security.krb5.name.case.sensitiveという新しいセキュリティプロパティが導入されました。このプロパティがtrueの場合、keytabおよびccacheエントリの検索においてプリンシパル名の比較は大文字と小文字を区別して行われます。後方互換性を確保するために、デフォルト値はfalseです。
さらに、同じ名前のシステム・プロパティが指定されている場合、java.securityファイルで定義されているセキュリティ・プロパティ値が上書きされます。
New javac -Xlint Suboption to Report “Dangling Doc Comments” (JDK-8303689)
javacの-Xlintオプションに、ソースコード内のドキュメントコメントの配置に関する問題を検出するための新しいサブオプションが追加されました。
新しいサブオプションの名前はdangling-doc-commentsです。このサブオプションは明示的に(例:-Xlint:dangling-doc-comments)または、他のすべてのサブオプションの1つとして暗黙的に(例:-Xlintまたは-Xlint:all)指定できます。このサブオプションが有効になっている場合、javacは宣言の近辺にある予期しない、または不適切なドキュメントコメントを報告します。例えば、以下のようなものです。
- パッケージまたはインポート宣言の前に記述されたトップレベルクラスのドキュメントコメント
- 宣言の最初のトークンの後ろに表示された宣言のドキュメントコメント(宣言に対するアノテーションやその他の修飾子の後ろなど)
- javacが通常は無視する宣言の前の追加のドキュメントコメント、など
-Xlintの任意のサブオプションと同様に、警告を局所的に抑制するには、警告を抑制するサブオプションの名前を指定して、@SuppressWarningsを宣言に付加します。
Improve Structural Navigation in API Documentation (JDK-8320458)
標準のdocletで生成したAPI ドキュメントに、現在のページの目次を含むサイドバーや、ページ・ヘッダー内の現在の API要素のbreadcrumbナビゲーションといった、強化されたナビゲーション機能が追加されました。
クラスおよびインターフェースのドキュメントでは、サイドバーの上部にあるテキスト入力フィールドを使用して、目次内の項目をフィルタリングできます。サイドバーの下部にあるボタンを使用すると、現在のセッションで目次を折りたたんだり展開したりできます。
Template for Creating Strict JAXP Configuration File (JDK-8330542)
今後の JDK リリースでは、デフォルトでXML処理をより厳格にする方向で進んでいく予定です。開発者がこれらの変更に備えられるよう、このリリースには、より厳格な XML 処理設定を指定するJAXP構成ファイルテンプレート($JAVA_HOME/conf/jaxp-strict.properties.template)が含まれています。
Configuration
https://docs.oracle.com/en/java/javase/23/docs/api/java.xml/module-summary.html#Conf
最後に、すべての機能リリースと同様に、JDK 23には、基本となるOSやファームウェアのアップデートや標準規格への適応を含め、パフォーマンス、安定性、セキュリティに関する何百ものアップデートが含まれています。ユーザーやアプリケーション開発者は通常、これらの変更に気づくことなく恩恵を受けることになりますが、それぞれの変更に関する情報はOpenJDK issue trackerで確認できます。
Issue tracker
https://bugs.openjdk.org/browse/JDK-8339105?jql=project%3DJDK%20AND%20fixVersion%3D23
And the constant feature, included in all JDK releases: Predictability
JDK 23 は、6か月ごとのリリースサイクルで予定通りに提供された14番目の機能リリース(feature release)です。このレベルの予測可能性ゆえに、開発者は継続的な改善により、イノベーションの採用を容易に管理できます。

Javaのパフォーマンス、安定性、セキュリティを向上させる能力は、Javaを世界で最も人気の高いプログラミング言語たらしめ続けています。
OracleはJDK 23の長期サポート(long-term support / LTS)を提供しません。JDK 23は、2025年3月にOracle JDK 24に置き換えられるまで、アップデートを提供します。
Java 23, Together
これまでのリリースと同様、Java 23はOpenJDKコミュニティの多くの個人や組織の貢献の結果によるものです — we all build Java, together!
JDK 23 Fix Ratio
JDK リリースにおける変更の割合は長年にわたってほぼ一定でしたが、6か月ごとのリリースでは、実用可能な機能や改善の提供ペースが大幅に増加しました。
JDK 23 における変更は、重要な新機能から、日常的なメンテナンス、バグ修正、ドキュメントの改善といった小規模な機能強化まで多岐にわたります。 変更はそれぞれ、JDK Bug Systemの1個のIssueに対する1個のコミットで表されます。
JDK Bug System
https://bugs.openjdk.org/secure/Dashboard.jspa
Java 11からJava 23での各GA時点で解決済み(fixed)とマークされた28,724件の課題のうち、20,450件はOracleの社員が対応し、8,274件は個々の開発者や他の組織に所属する開発者が貢献してくれました。issueを調査し、担当者の組織データを照合した結果、Javaへの貢献開発を支援した組織は以下の図のようになりました。

Java 23では、2,277件のJIRAのissueが修正済みとマークされ、そのうち1,608件はOracle社員が対応し、669件はJavaコミュニティの他のメンバーが貢献してくれました。

Oracleは、Alibaba、Amazon、Google、IBM、Intel、ISCAS、Microsoft、Red Hat、Rivos、SAP、Tencentなどの組織に所属する開発者の方々の多大な貢献に感謝いたします。また、Ampere Computing、Bellsoft、Loongson、NTT Dataなどの小規模な組織や、独立した開発者の方々による貢献にも感謝いたします。彼らの貢献は、Java 23における修正の5%を占めています。
さらに、ビルド品質に関する貴重なフィードバックを提供したり、高品質なバグを記録したり、頻繁に更新を提供してくださった以下の個人の方々にも感謝いたします。
- Sanne Grinovero (Hibernate projects)
- Yoann Rodière (Hibernate projects)
- Stefano Cordio (AssertJ)
- Rich Hillegas (Apache Derby)
- Chris Hegarty (Elastic)
さらに、OpenJDK Quality Outreachプログラムを通じて、Java 23 の早期アクセスビルドのテストに協力し、リリースの品質向上に役立つ素晴らしいフィードバックを提供してくださった以下の FOSS プロジェクトおよび個人の方々に感謝いたします。
Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach
- Apache Ant (Jaikiran Pai)
- Apache Commons (Benedikt Ritter)
- Avaje (Josiah Noel)
- BNYMellon CodeKatas (Emilie Robichaud)
- JobRunr (Ronald Dehuysser)
- RxJava (David Karnok)
Resources
Javaは、今日の技術トレンドにおいて#1のプログラミング言語であり続けています。Java 23による改良のオンタイムな提供が示すように、継続的な綿密な計画とエコシステムの関与を通じて、Javaプラットフォームは、最新の開発とクラウドでの成長に向けて十分な態勢を整えています。
ニュースやアップデートの最新情報は、以下の方法で入手できます。
| Dev.java | Javaの知識を深め、コミュニティに参加するためのOracleの専用ポータルサイト |
| Inside.java | Oracle Javaチームによるニュースおよび意見を見るためのサイト |
| Inside.java Podcast | Java開発者向けのオーディオ・ショーで、OracleでJavaを作成している人が直接説明します。 |
| Duke’s Corner Podcast | Java コミュニティの著名人の個人的なストーリー、経験、専門知識を紹介するオーディオ・ショー |
| Java on YouTube | Javaの専門知識を深めるのに役立つ、OracleのJava関連動画コレクション |
| Inside.java Newscast | Inside.Javaポッドキャストをビデオ形式に拡張したビデオ番組 |
| JEP Café | 人気のあるJEP (JDK Enhancement Proposals) について説明するOracleの動画 |
| Sip of Java | あまり知られていないJava拡張機能の紹介を提供するOracleの1分間の短編動画 |
| OpenJDKメーリングリスト | お気に入りのOpenJDKプロジェクトの進捗状況を把握できるメーリングリスト |
| Xのフォロー @OpenJDK @Java | Javaの継続的な進化に関する最新情報とニュースを提供するソーシャルストリーム |
| Inside Java Newsletter | 主要なJava技術やコミュニティの最新情報をまとめたOracleが毎月発行するニュースレター |