![見出し画像](https://assets.st-note.com/production/uploads/images/132314895/rectangle_large_type_2_3dbc299157ed1c17d1bf5c593a364382.png?width=1200)
Java 21に追加された新機能
前回の記事では、Java18からJava21へのアップデートに伴って廃止される機能について紹介しました。
今回は、Java21で新たに追加された機能について紹介していきます!
Java 21がリリースされ、開発者はプログラミング言語とプラットフォームの次のバージョンを試すことができます。 Java 21にはパフォーマンスの改善、ガベージコレクションの更新、その他の機能強化が含まれています。ここでは、JDK 21の主な新機能を見ていきましょう。
JDK 21の15の新機能には以下が含まれています:
![](https://assets.st-note.com/img/1709101824322-M2B4uTS9Oz.png?width=1200)
上記のうち、いくつかをピックアップして詳しく説明していきます。
構造化並列処理(プレビュー段階)
タスクグループを1つの単位として扱う構造化並列処理APIを通じて、並列プログラミングをシンプルにします。これにより、異なるスレッドで実行される関連タスクのエラー処理とキャンセルがストリームライン化され、信頼性が向上し観測性が強化されます。構造化並列処理は以前JDK 20とJDK 19(それぞれ2022年3月と9月にリリース)でインキュベートされていました。
今回の唯一の大きな変更点は、StructuredTaskScope::Forkメソッドが
Futureの代わりに[Subtask]を返すことです。
構造化並列処理の目的は、キャンセルとシャットダウンに起因するスレッドリークやキャンセル遅延などの一般的なリスクを排除できる並列プログラミングスタイルを推進し、同時コードの観測性を改善することです。
スコープ付き値(プレビュー)
スレッド内外で不変データを共有できるようになります。大量の仮想スレッドを使用する場合、特にスレッドローカル変数よりも優先されます。スレッドローカル変数には、無制限の可変性、無制限のライフタイム、高価な継承などの設計上の欠陥があります。スコープ付き値を使用することで、大規模プログラム内のコンポーネント間でデータを安全に共有できるようになり、メソッド引数に頼る必要がなくなります。この提案はJDK 20でインキュベートされました。計画の目標は、使いやすさ、分かりやすさ、ロバスト性、パフォーマンスです。
鍵カプセル化メカニズムのAPI
公開鍵暗号方式によって対称鍵を保護する暗号化技術です。 この提案の目的の1つは、アプリケーションがRSA鍵カプセル化メカニズム(RSA-KEM)、楕円曲線統合暗号方式(ECIES)、国立標準技術研究所(NIST)の量子耐性暗号標準化プロセスの候補アルゴリズムなどのKEMアルゴリズムを利用できるようにすることです。もう1つの目的は、トランスポート層セキュリティ(TLS)などの高次プロトコルや、ハイブリッド公開鍵暗号方式(HPKE)などの暗号スキームでKEMを利用できるようにすることです。 セキュリティプロバイダは、JavaコードまたはネイティブコードのいずれかでKEMアルゴリズムを実装でき、RFC 9180で定義されているDiffie-Hellman KEM(DHKEM)の実装を含めることができます。
無名クラスとインスタンスメインメソッドのプレビュー
学生が大規模プログラム向けに設計された言語機能を理解する必要なく、最初のJavaプログラムを書けるようにJava言語を発展させることを目的としています。Javaの別の方言を使用するのではなく、学生はシングルクラスプログラムのための簡潔な宣言を書き、プログラムをシームレスに拡張して、スキルが伸びるにつれてより高度な機能を使用できるようになります。この提案はJavaへのスムーズな入門だけでなく、スクリプトやコマンドラインユーティリティなどのシンプルなJavaプログラムを書く際の冗長さも軽減します。
多世代ZGCは、若いオブジェクトと古いオブジェクトを個別の世代で管理することにより、ZGCのパフォーマンスを向上させることを目的としています。若いオブジェクトは早期に消える傾向にあるため、個別の世代を維持することで、ZGCは若いオブジェクトをより頻繁に収集できます。世代別ZGCを使用するアプリケーションは、以下のメリットが得ることができます。
・割り当てストールのリスク低減;
・必要ヒープメモリオーバーヘッドの低減;
・ガベージコレクションCPUオーバーヘッドの低減
これらのメリットは、非多世代ZGCと比較してスループットの大幅な低下することがありません。
スイッチ式とステートメントのパターンマッチング
switch式やステートメントが複数のパターンと、パターンごとの特定のアクションでテストできるようになり、複雑なデータ中心のクエリを安全かつ簡潔に表現できます。
この機能は当初JDK 17で提案され、その後JDK 18、JDK 19、JDK 20で洗練されてきました。
JDK 21では、さらなるフィードバックと経験に基づいて機能が最終化されました。
以前のJEPからの主な変更点は、カッコで囲まれたパターンの削除と、switch式およびステートメントでの列挙型定数の修飾子(ケース定数など)の許可です。目的は、ケースラベルにパターンが表示できるようにしたり、必要に応じてswitchの従来のnull非寛容性を緩和したり、パターンswitchステートメントがすべての潜在的な入力値をカバーする必要があることで、
switchステートメントの安全性を高めたりすることにより、switch式とステートメントの表現力と適用範囲を拡大することです。
もう1つの目的は、既存のswitch式とステートメントが変更なしでコンパイルされ、同一のセマンティクスで実行され続けることを保証することです。
文字列テンプレートは、JDK 21のプレビュー機能であり、既存の文字列リテラルとテキストブロックにリテラルテキストと埋め込み式やプロセッサを組み合わせることで、特殊な結果を生成します。
この言語機能とAPIは、実行時に計算される値を含む文字列を簡単に表現できるようにすることで、Javaプログラムの記述を簡素化することを目的としています。式の可読性を向上させ、プログラムのセキュリティを改善し、柔軟性を保持し、Java言語以外で記述された文字列を受け入れるAPIの使用を簡素化することも目指しています。
リテラルテキストと埋め込み式を組み合わせて得られる文字列以外の式の開発も目的の1つです。
長期サポートリリースとして、JDK 21は5年間のプレミアサポートと2031年9月までの拡張サポートを行う予定です。
前回のLTSリリースは2021年9月に公開されたJDK 17です。JDK 20やJDK 19などの非LTSリリースは、6ヶ月のプレミアサポートのみで拡張サポートはありませんでした。LTSリリースは2年ごとに提供されます。
Java 21の多くの機能は、主要な「名前付き」Java開発プロジェクトから派生しています。仮想スレッド、スコープ付き値、構造化並列処理は、並列処理に焦点を当てたProject Loomに由来します。文字列テンプレート、レコードパターン、スイッチのパターンマッチング、無名パターンと変数、無名クラスとインスタンスメインメソッドは、小規模なJava生産性機能をインキュベートするProject Amberに由来します。外部関数とメモリAPI、ベクタAPIは、Javaとネイティブコードを接続することを目的としたProject PanamaからJava 21に導入されました。
次回の記事では、2024年3月にリリース予定のJava23について触れていきます。
私が通っているDEV.LAB(ディラボ)とは…
”一生使えるスキルを学ぶ”ことができる 未経験から現場での活躍を目指す
超実践OJT開発型をおこなっているプログラミングスクールです。
基礎的なJavaの知識から応用まで学ぶことができ、わからないことがあれば丁寧に教えてくれます。
Java × Springを現役エンジニアから学ぶことができ充実したサポートもあります。
![](https://assets.st-note.com/img/1709102118283-ccnfw0VmcZ.png?width=1200)
この記事が気に入ったらサポートをしてみませんか?