原文はこちら。
The original article was written in Sharat Chander (Senior Director, Java SE Product Management, Oracle).
https://inside.java/2024/03/19/the-arrival-of-java-22/
XでJavaとOpenJDKのフォローをよろしくお願いします。
JDK 22 is Now Available!
Oracleは開発者、企業、およびエンドユーザー向けにJDK 22の一般提供を開始したことを発表します。
New with Java 22
JDK 22では、7個のプレビュー機能と1個のインキュベーター機能を含む、JDK Enhancement Proposals (JEP) に値するほど重要な12の機能強化が行われています。これらの範囲は、Java言語、そのAPI、パフォーマンス、およびJDKに含まれるツールの改善にまでおよびます。
JDK 22
https://openjdk.org/projects/jdk/22/
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.org/jeps/1
Language Improvements
Unnamed Variables & Patterns – JEP 456
変数宣言やネストされたパターンが必要だが使用されていない場合の可読性が向上します。どちらもアンダースコア文字で示されます。
Values
- 指定されたバインディングまたはラムダ・パラメータが未使用であるという開発者の意図を把握し、そのプロパティを強制してプログラムを明確にし、エラーの機会を減らします。
- (
catch
節などで)宣言が必要だが不使用の変数を特定することで、すべてのコードの保守性が向上します。 - どのパターン変数も宣言していない場合、1 つの
case
ラベルに複数のパターンを出現させることができます。 - 不要な入れ子の型パターンを除外することで、recordパターンの可読性が向上します。
Language Previews
Statements before super (…) [Preview] – JEP 447
コンストラクタにて、生成中のインスタンスを参照しないステートメントを、明示的なコンストラクタ呼び出しの前に記述できるようになりました。
Values
- 現在、補助的な静的メソッド、補助的な中間コンストラクタ、またはコンストラクタ引数に組み込む必要のあるロジックを、より自然に配置できるようになります。
- 「クラスのインスタンス化時にコンストラクタがトップダウンの順序で実行される」という既存の保証が維持されるため、サブクラスのコンストラクタのコードがスーパークラスのインスタンス化に干渉することはありません。
- Java仮想マシン(の設定)に一切変更を入れる必要はありません。このJava言語機能は、コンストラクタ内での明示的なコンストラクタ呼び出しの前に記述されたコードを検証して実行するという、JVMの現在の機能にのみ依存しているためです。
String Templates (2nd Preview) – JEP 459
文字列テンプレートは、Javaの既存の文字列リテラルとテキスト・ブロックを補完するもので、リテラル・テキストを埋め込み式やテンプレート・プロセッサと結合して、特定の結果を生成します。
Value
- 実行時に計算される値を含む文字列を簡単に表現できるようにすることで、Java プログラムの作成がシンプルになります。
- テキストが 1 行のソース行に収まる場合(文字列リテラルの場合)でも、複数のソース行にまたがる場合(テキスト・ブロックの場合)でも、テキストと式が混在する式の可読性が向上します。
- テンプレートと埋め込まれた式の値の両方の検証と変換をサポートしているため、ユーザーが提供した値から文字列を構成し、他のシステム(例えば、データベースのクエリを構築する)に渡すJavaプログラムのセキュリティが向上します。
- Javaライブラリが使用する書式構文を文字列テンプレートで定義できるため、柔軟性を確保します。
- Java以外の言語で書かれた文字列(SQL、XML、JSONなど)を受け付けるAPIの使用を簡素化します。
- 中間文字列表現(intermediate string representation)を経由せずに、リテラル・テキストや埋め込み式から計算された非文字列値の作成を可能にします。
Implicitly Declared Classes and Instance Main Methods (2nd Preview) – JEP 463
大規模なプログラムのために設計された言語機能を理解しなくても、学生は初めてのJavaプログラムを記述できるようになりました。言語の別の方言を使用する代わりに、単一のクラス・プログラムのための簡素化された宣言を記述でき、スキルの成長につれて、より高度な機能を使用するようにプログラムをシームレスに拡張できます。
Value
以下により、Javaの学習が加速されることでしょう。
- Javaプログラミングへのスムーズな入口を提供するため、指導者は段階的に概念を紹介できます。
- 生徒が基本的なプログラムを簡潔に書けるようにし、スキルの成長に合わせてコードを適切に拡張できます。
- スクリプトやコマンドラインユーティリティのような簡単なプログラムを書く際の儀式を減らします。
- Java言語の初心者向けの個別の方言を導入するわけではありません。
- Java言語の初心者向けの個別のツールを導入するわけではありません。学生のプログラムは、任意のJavaプログラムをコンパイルして実行するための同じツールでコンパイル・実行される必要があります。
Libraries
Foreign Function & Memory API – JEP 454
JavaプログラムがJavaランタイムの外のコードやデータと相互運用できるようにします。外部関数(JVM外のコード)を効率的に呼び出したり、外部メモリ(JVMによって管理されていないメモリ)に安全にアクセスしたりできるこのAPIを使えば、Javaプログラムが、JNIのもろさや危険性に曝されることなく、ネイティブライブラリを呼び出したり、ネイティブデータを処理したりできるようになります。
Value
- 【生産性】ネイティブ・メソッドと Java Native Interface (JNI) のもろい仕組みを、簡潔で読みやすく、純粋な Java API で置き換えます。
- 【パフォーマンス】JNIや
sun.misc.Unsafe
と同等か優れているととは言わないまでも悪くないオーバーヘッドで、外部関数やメモリへのアクセスを提供します。 - 【幅広いプラットフォームのサポート】JVMが動作するすべてのプラットフォームで、ネイティブライブラリの検出と呼び出しを可能にします。
- 【統一性】複数の種類のメモリ(ネイティブ・メモリ、永続メモリ、管理ヒープメモリなど)において、構造化データおよび非構造化データを操作する方法を提供します。
- 【健全性】複数のスレッド間でメモリが割り当てられたり解放されたりしても、use-after-freeバグが発生しないことを保証します。
- 【完全性】プログラムはネイティブ・コードやデータに対して安全でない操作が可能ですが、そのような操作についてはデフォルトでユーザーに警告します。
Libraries Previews and Incubator
Class-File API (Preview) – JEP 457
Javaクラスファイルの解析、生成、変換のための標準APIを提供します。
Value
- この API により、フレームワークとそれに依存するプログラムは、最新のJDKからの最新のクラスファイルを自動的にサポートし、クラスファイルに記述された新たな言語やVMの機能を、迅速かつ容易に取り込むことができます。
Stream Gatherers (Preview) – JEP 461
Enhances the Stream API to support custom intermediate operations. This will allow stream pipelines to transform data in ways that are not easily achievable with the existing built-in intermediate operations.
Stream APIを強化し、カスタム中間操作をサポートします。これにより、Streamパイプラインは、既存の組み込み中間操作では容易に達成できない方法でデータを変換できるようになります。
Value
- Streamのよく使われるカスタム操作をより柔軟でわかりやすくすることで、開発者の生産性とコードの可読性が向上します。可能な限り、中間操作で無限サイズのストリームを操作できるようにします。
Structured Concurrency (2nd Preview) – JEP 462
並行プログラミングを簡素化します。構造化並行処理では、異なるスレッドで実行される関連タスクのグループを 1 つの作業単位として扱うため、エラー処理とキャンセルがシンプルになり、信頼性が向上し、可観測性(observability)が高まります。
Value
- スレッドのリークやキャンセルの遅延など、キャンセルやシャットダウンに起因する一般的なリスクを排除できるプログラミング・スタイルを促進することで、並行処理するコードの開発を簡素化し、並行処理するコードの観測可能性を向上させます。
Scoped Values (2nd Preview) – JEP 464
スレッド内およびスレッド間での不変(immutable)データの効率的な共有を可能にします。
Value
- 【使いやすさ】スレッド内と子スレッドの両方でデータを共有するプログラミング・モデルを提供し、データ・フローに関する推論を簡素化します。
- 【理解しやすさ】コードの構文構造から共有データのライフタイムが見えるようにします。
- 【堅牢性】呼び出し元が共有するデータを、正当な呼び出し元のみが取得できるようにします。
- 【パフォーマンス】共有データを不変データとして扱うことで、多数のスレッドによる共有を可能にし、実行時の最適化を可能にします。
Vector API (7th Incubator) – JEP 460
サポート対象のCPUアーキテクチャ上で最適なベクトル命令に実行時に確実にコンパイルされるベクトル計算を表現するためのAPIです。このJEPは、JDK 21と比較してAPIを小規模ながらも強化し、JDK22で再度APIをインキュベートするよう提案します。実装にはバグ修正とパフォーマンス強化が含まれます。以下の注目すべき変更が含まれています。
任意のプリミティブ要素型の配列で保持されるヒープMemorySegment
でのベクトル・アクセスをサポートするようになりました(これまでは、byte
型の配列で保持されるヒープMemorySegment
に限定されていました)。
Value
- ループ内で合成されたベクトル演算のシーケンスで構成され、場合によっては制御フローを伴うベクトル演算の幅広い範囲を明確かつ簡潔に表現できるAPIを提供します。
- APIはCPUアーキテクチャに依存しないように設計されており、ベクトル命令をサポートする複数のアーキテクチャでの実装が可能です。
- x64およびAArch64アーキテクチャ上で信頼性の高いランタイム・コンパイルとパフォーマンスを提供します。
- Project Valhallaとの整合性を保ちます。
Performance
Regional Pinning for G1 – JEP 423
Java Native Interface (JNI) のクリティカルリージョンでGCを無効にする必要がないように、G1にリージョナル・ピニングを実装することで、待ち時間を短縮します。
Value
- JNI利用時に、G1によるGC操作完了前にJavaスレッドが待機する必要がなくなるため、開発者の生産性が向上します。
Tooling
Launch Multi-File Source-Code Programs – JEP 458
複数のファイルとしてJavaソースコードが提供されるプログラムでもコンパイルせずに実行できるようにします。
Value
- 小さなプログラムから大きなプログラムへの移行をより緩やかにすることで、開発者の生産性を向上させ、ビルド・ツールを構成する手間をかけるかどうか、またそのタイミングを開発者が選択できるようにします。
プレビュー機能は、Java SEプラットフォームの言語機能またはVM機能として完全に仕様化され、完全に実装されたものですが、永久的なものではないことに注意してください。これらは、将来のリリースで恒久的なものになる前に、実際の使用に基づく開発者のフィードバックを可能にするために、JDKフィーチャーリリースで利用可能になっています。これにより、ツールベンダーは、Java SE Standardに最終化される前に、機能のサポートに取り組むことができます。
インキュベータ・モジュールのAPIは、最終化されていないAPIとツールを開発者とユーザーの手に渡し、最終的にJavaプラットフォームの品質を向上させるフィードバックを収集することを目的としています。
JEP 11: Incubator Modules
https://openjdk.org/jeps/11
JEPで説明されている変更以外にも、リリースノートに記載されている多くの小さな更新があり、多くのアプリケーション開発者やシステム管理者が関心を持つでしょう。これらには、廃止されたAPIの非推奨化や、以前に非推奨となったAPIの削除などが含まれます。
JDK 22 Release Notes
https://jdk.java.net/22/release-notes
Java 22リリースノートから、主要なアップデートを一部ご紹介しましょう。
keytool
とjarsigner
へのアルゴリズムの追加- GCのスループットの改善(特にYoung世代のGC)
- システム・モジュール記述子のバージョン報告の改善
- ネイティブ・コードのwait処理オプションの改善
- Unicode 共通ロケール・データ・リポジトリのバージョン44への更新
- バイトコードからロードされた型に対するtype annotationのサポート
ForkJoinPool
とForJoinTasks
で、中断不可能なタスクをより適切に処理できるように改善- クライアントとサーバーのTLS接続プロパティを構成する自由度が増加
- ピーク使用量をレポートする機能を含む、ネイティブ・メモリ・トラッキングの改善
最後に、他の機能リリースと同様に、JDK 22には、基盤となるOSやファームウェアのアップデートや標準への対応を含む、数百ものパフォーマンス、安定性、セキュリティのアップデートが含まれています。ユーザーやアプリケーション開発者は通常、これらの変更に気づかずに、その恩恵を受けています。
And the constant feature included in all JDK releases: Predictability
JDK 22は、6ヶ月のリリースサイクルで予定通りに提供される13番目の機能リリースです。このレベルの予測可能性ゆえに、開発者は期待される改善の着実な流れの中で、イノベーションの採用を容易に管理できます。
パフォーマンス、安定性、セキュリティを向上させるJavaの能力ゆえに、Javaが世界で最も人気のあるプログラミング言語にあり続けています。
OracleはJDK 22の長期サポートを提供しません。Oracleは、JDK 22がOracle JDK 23に取って代わる2023年9月までアップデートを提供します。
Java 22, Together
これまでのリリースと同様、Java 22はOpenJDKコミュニティの多くの個人や組織の貢献を称えています — we all build Java, together!
JDK 22 Fix Ratio
JDKリリースの時間経過に伴う変更率は、ここ何年もほぼ一定でしたが、6ヶ月のリリースサイクルでは、実運用に耐えうる機能や改善が提供されるペースが急激に上がっています。
過去のメジャーリリースのように、数万件の修正や100件近いJEP(JDK機能強化提案)を数年ごとに提供するのではなく、より管理しやすく予測可能な6ヶ月のスケジュールで、よりスリムな機能リリースとして機能強化を提供します。変更の範囲は、重要な新機能から小規模な機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善まで多岐にわたります。各変更は、JDK Bug Systemの1つのIssueに対する1つのコミットで表現しています。
GA の時点でJava 11からJava 22で修正済みとマークされた26,447件のJIRAのIssueのうち、18,842件はOracle従業員が完了し、7,605件は個人の開発者や他の組織で働く開発者が提供してくれました。Issueを調べ、担当者の組織データを照合したところ、Javaでの貢献の開発を後援している組織は以下の表のようになりました。
Java 22では、2,251件のJIRAのIssueは修正済みで、そのうち1,554件はOracleの従業員が対応し、697件はJavaコミュニティメンバーが貢献してくれました。
Oracleは、Amazon、ARM、Google、Huawei、IBM、Intel、ISCAS、Microsoft、Red Hat、Rivos、SAP、Tencentなどの組織で働く開発者の顕著な貢献に感謝したいと思います。また、BellsoftやData Dog、Loongsonのような小規模な組織や、Java 22の修正の7%に貢献した独立系開発者からの貢献にも感謝しています。
さらに、OpenJDK Quality Outreachプログラムを通じて、Java 22の早期アクセスビルドのテストに素晴らしいフィードバックを提供し、リリースの品質向上に貢献してくれた以下の FOSS プロジェクトにも感謝したいと思います。
Quality Outreach
https://wiki.openjdk.org/display/quality/Quality+Outreach
- Apache Syncope (Francesco Chicchiriccò)
- Apache Tomcat (Mark Thomas)
- ApprovalTests.Java (Lars Eckart)
- AssertJ (Stefano Cordio)
- Avaje (Josiah Noel)
- Jetty (Simone Bordet)
- MyBatis (Iwao Ave)
- Parallel Collectors (Grzegorz Piwowarek)
- RxJava (David Karnok)
Resources
Javaは、今日の技術トレンドにおいて#1のプログラミング言語であり続けています。Java 22による改良のオンタイムな提供が示すように、継続的な綿密な計画とエコシステムの関与を通じて、Javaプラットフォームは、最新の開発とクラウドでの成長に向けて十分な態勢を整えています。
ニュースやアップデートの最新情報は、以下の方法で入手できます。
Dev.java | Javaの知識を深め、コミュニティに参加するためのOracleの専用ポータルサイト |
Inside.java | Oracle Javaチームによるニュースおよび意見を見るためのサイト |
Inside.java Podcast | Java開発者向けのオーディオ・ショーで、言語、JVM、OpenJDK、プラットフォーム・セキュリティ、LoomやPanamaなどのイノベーション・プロジェクト、そしてその間にあるあらゆることについて、Oracleで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プロジェクトの進捗状況を把握できるメーリングリスト |
Twitterのフォロー @OpenJDK @Java | Javaの継続的な進化に関する最新情報とニュースを提供するソーシャルストリーム |
Inside Java Newsletter | 主要なJava技術やコミュニティの最新情報をまとめたOracleが毎月発行するニュースレター |