※ 本記事は、Sharat Chanderによる”The Arrival of Java 23“を翻訳したものです。
2024年9月24日
Java 23の提供を開始しました!
オラクルは、開発者、企業、エンドユーザー向けにJDK 23の一般提供を発表できることを嬉しく思います。
Java 23の新機能
JDK 23 では、8つのプレビュー機能と1つのインキュベータ機能を含むJDK Enhancement Proposals – JEPsを保証するのに十分な 12の機能強化を提供します。新リリースでは、Java言語の改善、APIの拡充、プラットフォームのパフォーマンスの強化、JDKに含まれるツールの改良がおこなわれています。Javaプラットフォームの強化に加えて、Oracle JDK 23には、Oracle GraalVM JIT コンパイラ (ジャストインタイム・コンパイラ/Graal JITコンパイラ)が追加されています。詳しくは、こちらのブログを参照してください。
言語の改善:
JEP 455: プリミティブ型のパターン、instanceof, and switch (プレビュー)
これにより、パターン・マッチング、instanceof、switchを使用する際に開発者が直面するプリミティブ型に関する制約を緩和します。 プリミティブ型とオブジェクト型を処理するコードは特別な許可が不要であり、同じ方法で処理が可能です。また、instanceof がプリミティブ型を受け取ると、値がターゲット・タイプに対して有効であることを確認するためにチェックする必要がある場合、条件付きキャストを自動的に実行できるようになるため、一般的なケースのコードがさらに減少します。
モジュールがエクスポートしたすべてのパッケージを迅速かつ簡単にインポートできるようになるため、開発者の生産性が向上します。 インポート・コードをモジュール自体に配置する必要もなくなり、モジュール・ライブラリの再利用が簡単になります。 この機能により、初心者でもパッケージ階層内の位置を学習することなく、サードパーティ・ライブラリや基本的なJavaクラスを使用できるようになります。
大規模なプログラム向けに設計された言語機能を理解することなく、初心者でも最初のJavaプログラムを作成できるようにします。また、単一クラス・プログラム用の簡素化された宣言を記述し、必要に応じてプロ恨むをシームレスに拡張したり、より高度な機能を使用できます。経験豊富なJava開発者は、簡潔に小規模なプログラムをを記述することができます。
JEP 482: 柔軟なコンストラクタ本体(第2プレビュー)
super(..) や this(..) などの明示的なコンストラクタ呼出しの前に文を表示できるようにすることで、開発者はコンストラクタの動作をより自由に表現できるようになります。ロジックがより自然に配置されるため、チェック及び初期化ロジックの一部を補助静的メソッド、補助中間コンストラクタにファクタリングする必要がなくなります。例えば、コンストラクタがスーパークラスのコンストラクタを呼び出す前に表示される引数を検証すると、引数が無効な時はすぐに失敗し、スーパークラスの不要なインスタンス化を回避できます。
ライブラリ
JEP 466: Class-File API (第2プレビュー)
Java Virtual Machine仕様で定義されたJavaクラス・ファイルの解析、生成、変換のための標準APIを提供します。このAPIはフィーチャー・リリースの一部として各バージョンのリリースごとに更新されており、年4回のJavaの定期リリースを導入する際に、クラスファイルを操作して新しいバージョンをスムーズに採用いただけます。この機能が最終化される際に、JDKをサード・パーティのASMライブラリへの依存から解放する必要があります。
ベクトル計算を表現し、実行時にサポートされているCPUアーキテクチャのベクトル命令に確実にコンパイルするためのAPIを導入することで、開発者の生産性向上を支援します。これにより、開発者は同等のスカラー計算よりも優れたパフォーマンスを実現できます。JDK 22では、この機能の7番目のインキュベーションに違いはありません。このAPIは、Project Valhallaからの必要な機能が使用可能になるまで、わずかな変更のみでインキュベートとして今後も戻ってくることが期待されています。
JEP 473 Stream Gatherers (第2プレビュー)
Stream API の機能を拡張してカスタムの中間操作に対応することで、開発者の生産性を向上させます。これにより、ストリーム・パイプラインは、既存の組み込み中間操作では困難だった方法でデータを変換できるようになります。ストリーム・パイプラインの柔軟性と表現力を強化し、カスタム中間操作で無限サイズのストリームを操作できるようにすることで、開発者はJavaコードの読取り、書込み、保守をより効率的に行えるようになります。この機能拡張により、5つのビルトイン・ギャザーが導入されました。
構造化された並行性のための新しいAPIにより並行プログラミングを簡素化することで、マルチスレッド・コードの保守性、信頼性、および可視性を向上させます。構造化された並行性は、異なるスレッドで実行されている関連タスクのグループを単一の作業単位に統合することで、スレッド・リークや取消遅延など、取消や停止に起因する一般的なリスクを排除します。
スレッド内およびスレッド間で不変データの共有を可能にすることで、開発者はプロジェクトの使いやすさ、理解しやすさ、パフォーマンス、堅牢性を向上させることができます。また、特に仮想スレッド (JEP 444) および構造化された並行性(JEP 480)とともに使用する場合、領域および時間のコストも低くなります。
パフォーマンス
ZGC(Z Garbage Collector)のデフォルト・モードを世代別モードに切り替えることで、2つの異なるモードをサポートするために必要なリソースと保守コストを削減し、開発者の効率を向上させることができます。JDK 21で導入された世代別ZGCの使用と社内テストからのフィードバックにより、ほとんどのユースケースで非世代別ZGCよりもパフォーマンスが大幅に向上することが確認されました。また、このJEPは、将来のJDKリリースで非世代別ZGCモードを削除を予定し非推奨としています。
ツール
Javadocドキュメント・コメントをHTMLおよびJavadoc @-タグのみでなくMarkdownでも記述できるようにすることで、開発者の効率性と生産性を向上させます。ドキュメント・コメントで、HTML要素およびJavaDocタグとともにMarkdown構文を使用できるため、開発者は、既存のドキュメント・コメントの解釈に悪い影響を与えることなく、ソース形式でAPIドキュメント・コメントを簡単に記述および読み取ることができます。
スチュワードシップ
JEP 471 sun.misc.unsafe のメモリアクセス・メソッド削除を予定した非推奨に設定
ほとんどの内部APIへのアクセスがJDK 9 (JEP 260)、さらにJDK 16 (JEP 396)、JDK 17 (JEP 403)で制限され、サポートされているAPIが使用できなかったタスクに広く使用されていたため、少数の内部サポートされていないAPIが使用可能になりました。オラクルの目標は、最終的にこれらのタスクにサポートされているAPIを提供し、サポートされていない内部APIへのアクセスを制限することでした。JDK 22にForeign Function and Memory API (JEP 454)が導入されたことで、オフヒープ(外部)メモリーに効率的にアクセスするためのサポートされているAPIが提供されました。そのため、 sun.misc.unsafe のメモリアクセス・メソッドを将来のリリースで削除が予定されていることを発表し、アプリケーションが直接または間接的に依存しているかどうかを開発者が理解できるようにするための簡素化されたツールセットを提供します。
プレビュー機能とインキュベータ機能に関するリマインダ
プレビュー機能は完全に指定され、Java SEプラットフォームの言語またはVM機能が完全に実装されていますが、永続的ではありません。これらは、JDK Feature Releasesで利用できるようになり、将来のリリースで恒久的になる前に、実際の用途に基づく開発者フィードバックが可能になります。また、ツール・ベンダーは、Java SE Standardに完成する前に、機能のサポートに取り組む機会を得ることができます。
インキュベータ・モジュール のAPIは、最終的にJavaプラットフォームの品質を向上させるフィードバックを収集できるように、開発者やユーザーの手に非最終APIおよび非最終ツールを配置します。
その他の変更
JEPで説明されている変更の他に、リリースノート には、多くのアプリケーション開発者およびシステム管理者にとって重要な多くの小さな変更点がリストされています。これには、廃止されたAPIの廃止や、非推奨になったAPIの削除が含まれます。
Java 23 リリースの主な更新:
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)
ユーザーは、文字列を出力したり、指定されたロケールでフォーマットされたプロンプトテキストを表示できるようになりました。これは、デフォルトのlとは無関係である可能性があります。 例えば、スニペット System.console().printf(Locale.FRANCE, “%1$tY-%1$tB-%1$te %1$tA”, new Date()) は以下を表示します: 2024-mai-16 jeudi
Add jdk.SerializationMisdeclaration JFR Event (JDK-8275338)
新しい jdk.SerializationMisdeclaration JFR イベントは、シリアライズ関連のフィールドおよびメソッドの一部が適切に宣言されていないときに実行時にトリガーされます。 jdk.SerializationMisdeclarationを有効にすると、JFRは、JVMにロードされた直列化可能クラスの不適切に宣言された側面ごとにイベントをトリガーします。
たとえば、Serializableクラスの writeObject() メソッドのシグネチャは正しいが、意図せずpublicと宣言されている場合、シリアライズ・マシンでは選択されません。クラスの開発者にとっては驚きかもしれません。このような問題の診断に役立つように、 jdk.SerializationMisdeclaration イベントを有効にする必要があります。
標準のdefault.jfcプロファイルはこれらのイベントを有効にしませんが、標準のprofile.jfcプロファイルは有効にします。
Support for Duration Until Another Instant (JDK-8331202)
指定されたInstantまでDurationを取得するために、新しいメソッドが java.time.Instant クラスに追加されました。新しいメソッド: Instant.until(Instant) は、 Duration.between(Temporal, Temporal) と同じ期間を生成しますが、ユーザーが検出しやすくなります。この新しいメソッドは、単位変換なしでDurationを直接戻すという点で、method 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など)、すべてのサブオプション(-Xlintや-Xlint:allなど)の1つとして暗黙的に指定できます。サブオプションが有効になっている場合、javacは、次のような状況で、宣言の近くに予期しない、または誤って配置されたドキュメント・コメントを報告します。:
- パッケージまたはインポート宣言の前のトップレベルクラスのドキュメントコメント;
- 宣言の最初のトークンの後に現れる宣言のドキュメント・コメント。宣言の注釈やその他の修飾子の後など; or
- javacが無視する宣言の前の追加ドキュメント・コメント
-Xlintの任意のサブオプションと同様に、警告をローカルで抑制するには、警告を抑制するサブオプションの名前を指定して、囲み宣言に @SuppressWarnings注釈を使用します。
Improve Structural Navigation in API Documentation (JDK-8320458)
標準ドックレットによって生成されるAPIドキュメントには、現在のページの目次を含むサイドバーや、ページ・ヘッダーの現在のAPI要素のブレッドクラム・ナビゲーションなどの拡張ナビゲーション機能が追加されました。
クラスおよびインタフェースのドキュメントでは、目次内のエントリは、サイドバーの上部にあるテキスト入力フィールドを使用してフィルタ処理できます。サイドバーの下部にあるボタンを使用すると、現在のセッションで目次を縮小または展開できます。
Template for Creating Strict JAXP Configuration File (JDK-8330542)
将来のJDKリリースは、XML処理をデフォルトで制限しやすくするために引き続き移行します。開発者がこれらの変更を準備できるように、このリリースには JAXP コンフィグレーション・ファイル テンプレート、 $JAVA_HOME/conf/jaxp-strict.properties.templateが含まれ、より限定的なXML処理設定が指定されています。
最後に、すべての機能リリースと同様に、JDK 23には、基盤となるOSやファームウェアの更新や標準への適応など、数百ものパフォーマンス、安定性、セキュリティ更新が含まれています。ユーザーおよびアプリケーション開発者は、通常、これらの変更に気付かずにその恩恵を受けますが、各変更に関する情報は、 OpenJDK issue trackerに記載されています。
すべてのJDKリリースに含まれる不変の機能: 予測可能性
JDK 23は、6か月間のリリース周期で定時提供される第14回機能リリースです。このレベルの予測可能性により、開発者は安定したリリース・スケジュールを把握し、イノベーションの採用を簡単に管理できます。
Javaのパフォーマンス、安定性、セキュリティを向上させる能力は、世界で最も人気のあるプログラミング言語であり続けています。
OracleはJDK 23の長期的なサポートを提供しません。Oracle JDK 24に取って代わる更新は、2025年3月まで提供します
Java 23は協業の成果
今回のJava 23のリリースは、オラクルと世界中のJava開発者コミュニティの他のメンバーが、OpenJDKとJava Community Process(JCP)を通じて、継続的な協業を行った結果です。私たちは皆、Javaを一緒に構築しています!
JDK 23 修正率
JDKリリースにおける時間の経過に伴う変化の割合は、長年にわたって大きく変わってきましたが、6か月後には、本番対応の機能と改善が提供されるペースが大幅に増加しました。
JDK 23の変更は、大幅な新機能から小規模な機能拡張、定期的なメンテナンス、バグ修正、およびドキュメント改善まで多岐にわたります。各変更は、 JDK Bug System の1つの問題に対して1つのコミットで表されます。
GAの時点でJava 11からJava 23で修正されたとマークされた28,724件のJIRAの問題のうち、20,450件がOracleで働く人々によって完了し、8,274件が他の組織で働く個々の開発者および開発者によって貢献されました。問題を確認し、割当先から組織データを照合すると、Javaでの貢献の開発を後援する次の組織チャートになります:
Java 23では、修正済みとマークされた2,277件のJIRAの問題のうち、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プロジェクトおよび個人に感謝します。:
- Apache Ant (Jaikiran Pai)
- Apache Commons (Benedikt Ritter)
- Avaje (Josiah Noel)
- BNYMellon CodeKatas (Emilie Robichaud)
- JobRunr (Ronald Dehuysser)
- RxJava (David Karnok)
リソース
Javaは、今日のテクノロジ・トレンドにおいて、引き続きナンバー1のプログラミング言語です。Java 23による改善の期日どおりの提供が示すように、慎重な計画とエコシステムの継続的な関与を通じて、Javaプラットフォームはクラウドにおける最新の開発と成長のために適しています。
以下のサイトで最新情報をご紹介します:
- Visiting Dev.java (Oracle’s dedicated portal to advance your Java knowledge and community participation).
- Visiting Inside.java (news and views by the Java Team at Oracle).
- Listening to the Inside.java podcasts (an audio show for Java Developers brought to you directly from the people that make Java at Oracle).
- Listening to the Duke’s Corner Podcast (an audio show that features the personal stories, experiences and expertise of Java community luminaries).
- Watching Inside.java Newscasts (a video show extending the Inside.java podcast).
- Watching Java on YouTube (Oracle’s Java videos to help grow your Java expertise).
- Watching JEP Café (Oracle’s technical exploration into popular JDK Enhancement Proposals).
- Watching Sip of Java (Oracle’s 1-minute shorts offering introductions into lesser known Java enhancements).
- Joining the OpenJDK mailing lists (to learn about the progress of your favorite OpenJDK projects).
- Following OpenJDK and Java on X.
- Subscribing to the Inside Java Newsletter (a monthly publication summarizing many of the key Java technology and community updates from Oracle).