見出し画像

Java22 の新機能

こんにちは。前回の記事では昨年9月にリリースされたJava21の15の新機能について説明しました。
今回は、この3月にリリース予定のJava22の新機能について説明をしていきます。

3月にリリースされた次のJava Standard Edition、Java Development Kit 22は、第2および最終のリリース候補段階に達しました。
JDK 22には12の機能が含まれており、スコープ付き値の2番目のプレビューとストリームギャザラー(Stream gatherers)のプレビューが最後の追加となります。

JDK 22は2月9日に初めてのリリース候補となり、2月20日に第2のリリース候補段階に達しました。一般提供は3月19日にリリースされました。

スコープ付き値は、スレッド内およびスレッド間での不変のデータを安全かつ効率的に共有することを可能にします。これは、多くのスレッド変数を使用する場合に特に役立ちます。この機能の目標は、使いやすさ、理解しやすさ、堅牢性、およびパフォーマンスの向上です。

ストリームギャザラー(Stream gatherersは、ストリームAPIを拡張してカスタムの中間操作をサポートします。これにより、既存の組み込みの中間操作では簡単に実現できない方法で、ストリームパイプラインがデータを変換することが可能になります。

これらの最新機能は、第2の構造化並行性のプレビュー、super(…)の前の文のプレビュー、クラスファイルAPIのプレビュー、G1ガベージコレクターのためのリージョンピンニング、文字列テンプレートの第2のプレビュー、無名変数とパターン、外部関数とメモリAPI、およびベクトルAPIの第7のインキュベーターに加わります。暗黙的に宣言されたクラスとインスタンスメインメソッドの第2のプレビュー、およびJavaランチャーの拡張機能(複数ファイルプログラムの実行を可能にするもの)も提案されています。

構造化並行性を使用することで、関連するタスクのグループが異なるスレッドで実行されている場合でも、それらを単一の作業単位として扱うAPIを介して、並行プログラミングが簡素化されます。これにより、エラー処理やキャンセルの手続きが合理化され、信頼性が向上し、可観測性が高まります。このAPIはJDK 21でプレビューされ、JDK 19およびJDK 20でインキュベートされました。

Javaアプリケーションランチャーの強化により、複数のJavaソースコードファイルとして提供されるプログラムを実行できるようになります。複数のファイルからなるソースコードプログラムを実行できるようにする目的は、小規模なプログラムから大規模なプログラムへの移行をより段階的に行い、開発者がビルドツールの設定に手間をかけるかどうかを選択できるようにすることです。

クラスファイルAPIは、Javaクラスファイルの解析、生成、および変換のための標準APIを提供します。これは、JDKコンポーネントが標準APIに移行し、最終的にはJDKの内部コピーであるサードパーティのASMライブラリを削除することを可能にすることを目標としています。クラスファイルの解析、生成、および変換は、プログラムの拡張や検査を行うために独立したツールやライブラリによって頻繁に使用され、ソースコードの保守性を損なうことなく行われます。

しかし、Javaクラスファイル形式は、標準Javaの6ヶ月ごとのリリースペースにより、以前よりも速くアップデートしています。このアップデートの速さにより、フレームワークがクラスファイルライブラリよりも新しいクラスファイルによく遭遇することが増えました。これにより、エラーやフレームワーク開発者が未来のクラスファイルを解析するコードを書いて、何も大きな問題が起こらないことを願うことがよくあります。この計画の目標は、Javaプラットフォームがクラスファイル形式と共に進化するように、標準のクラスファイルAPIを定義および実装することです。

G1のリージョンピンニングは、レイテンシ(反応時間)を減らし、Java Native Interface(JNI)の重要な領域でのガベージコレクション(GC)の無効化を不要にすることを目指しています。これにより、重要なJNI領域によるスレッドの停止がなくなり、これらの領域によるGCの開始に追加の待ち時間が生じず、これらの領域が非アクティブな場合のGC停止時間の増加がなくなります。そして、これらの領域がアクティブな場合のGC停止時間の増加が最小限に抑えられます。現在、デフォルトのGCであるG1は、すべての重要な領域でガベージコレクションを無効にします。これは、レイテンシに重大な影響を与える可能性があります。この変更により、JavaスレッドはG1のGC操作が完了するのを待つ必要がなくなります。

JDK 21で、宣言されたクラスとインスタンスメソッドは、無名のクラスとインスタンスメソッドとしてプレビューされています。この機能は、JDK 22で改訂されたタイトルと重要な変更を受け、第2のプレビューで提供されます。この機能は、Java言語を進化させ、学生が大規模なプログラム向けに設計された言語機能を理解する必要なく、最初のプログラムを書くことができるようにすることを意図しています。学生は、単一クラスのプログラムのために簡略化された宣言を書き、スキルが向上するにつれてプログラムを拡張し、より高度な機能を使うことができます。

statements before super(…)のプレビューは、言語のコンストラクタに関連しており、明示的なコンストラクタの前に、インスタンスの作成を参照しないステートメントを許可します。この計画の目標の一つは、開発者にコンストラクタの振る舞いをより自由に表現させることであり、現在は補助的な静的メソッド、補助的な中間コンストラクタ、またはコンストラクタ引数に分割する必要があるロジックの自然な配置を可能にします。

別の目標は、クラスのインスタンス化中にコンストラクタが上から下へ順番に実行されることを既存の保証として維持することであり、サブクラスのコンストラクタ内のコードがスーパークラスのインスタンス化に干渉できないようにします。三番目の目標は、JVMに変更を加える必要がないことです。これは、これまでに標準のJavaでプレビューまたはインキュベートされていない、JDK 22の唯一の機能です。

字列テンプレートは、Javaの既存の文字列リテラルやテキストブロックを補完し、リテラルテキストを埋め込まれた式やテンプレートプロセッサと組み合わせて、特殊な結果を生成します。以下は、その目標です:

  • 実行時に計算された値を含む文字列を簡単に表現することで、Javaプログラムの作成を容易にする

  • テキストが単一のソース行に収まる場合でも、複数のソース行にまたがる場合でも、テキストと式が混在する式の可読性を向上させる。

  • 埋め込まれた式のテンプレートとその値の両方の検証と変換をサポートすることでユーザー側の値から文字列を構成し、他のシステムに渡すプログラムのセキュリティを向上させる

  • 文字列テンプレートで使用されるフォーマット構文をJavaライブラリが定義できるようにし、柔軟性を保持する

  • XMLやJSONなどのJava以外の言語で書かれた文字列を受け入れるAPIの使用を簡素化する

  • 中間文字列表現を介することなく、リテラルテキストと埋め込まれた式から計算された非文字列値の作成を可能にする

文字列テンプレートは、JDK 21の最初のプレビューで登場しました。
第2のプレビューでは、新たに必要なフィードバックを得ることを意図しています。テンプレート式のタイプに関する技術的な変更を除いて、最初のプレビューとの変更はありません。

ベクトルAPI(第7のインキュベーター)は、特定のCPUアーキテクチャで最適な命令にランタイムでコードを変換し、高速なベクトル計算を可能にするためのツールです。
これは、通常の計算よりも高速に処理を行うことができます。
このAPIを使うと、複雑なベクトルアルゴリズムをJavaで書くことができます。また、ベクトル化の予測可能性や堅牢性も向上します。

この機能は、過去のJavaのバージョンで試験的に導入されており、主に2021年3月のJDK 16から利用できるようになっています。このAPIの目標は、わかりやすく簡潔で、あらゆるプラットフォームで安定した実行や高速な処理ができることです。
また、x64 AArch64アーキテクチャでも同様に高速な処理が可能です。この機能は、Javaオブジェクトモデルの改善により、値オブジェクトとの連携が可能になります。

未命名の変数やパターンは、変数やパターンが必要だが実際には使われない場合に使われます。この計画の目標は以下の通りです:

  • 開発者が変数やラムダパラメーターが使用されていないことを明確にし、プログラムの理解を助け、エラーを減らすために開発者の意図を捉える。

  • 使用されないが宣言が必要な変数を特定することで、コードの保守性を向上させる。

  • パターン変数を宣言しないパターンが含まれる場合、1つのケースラベルに複数のパターンが表示されることを許可する。

  • 不要な入れ子型のパターンを省略して、レコードパターンの可読性を向上させ流。

このプランは、JDK 21でプレビューされ、JDK 22で変更なしに最終化されます。

外部関数およびメモリAPIを使用すると、JavaプログラムはJavaランタイム外のコードやデータと連携できます。
これにより、JavaプログラムはJNI(Java Native Interface)の脆弱性なしにネイティブライブラリを呼び出し、ネイティブデータを処理できます。

このAPIは以前、JDK 19、JDK 20、およびJDK 21でプレビューされました。そして、JDK 22で最終化されます。
最新の改訂では、次の4つの領域がカバーされています:

  • ネイティブ文字列に任意の文字セットをサポート

  • クライアントがC言語の関数記述子をプログラム的に構築できる機能

  • Enable-Native-Access JARファイルマニフェスト属性の導入。これにより、実行可能なJARファイルが特定のコマンドラインオプションを使用せずに制限されたメソッドを呼び出すことが可能

  • 新しいリンカーオプションを提供し、クライアントがヒープセグメントをダウンコールメソッドハンドルに渡すことが可能

Java 22はFeatureリリースで、オラクルから6か月間のサポートを受けます。一方、LTS(Long Term Support)リリースであるJDK 21は、少なくとも8年間のサポートを受けます。標準のJava更新は6か月ごとに行われ、LTSリリースは2年ごとに行われます。

InfoWorldより

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

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