JDK 21リリースにおける重要な変更

JDK 21の新機能と拡張機能、およびAPI仕様の詳細は、JDK 21リリース・ノートを参照してください。

Java SE 21およびJDK 21の更新内容の一部を次に示します:

言語機能

  • レコード・パターンとタイプ・パターンをネストすると、強力で宣言的かつ組立て可能な形式のデータのナビゲーションや処理が可能になります。レコード・パターンを使用して、値がレコード・クラス・タイプのインスタンスであるかどうかをテストし、該当する場合はそのコンポーネント値に対してパターン・マッチングを再帰的に実行できます。このリリースでは、拡張for文のヘッダーに表示されるレコード・パターンのサポートが削除されました。

    『JEP 440: Record Patterns』および『Java Platform, Standard Edition Java言語更新』レコード・パターンに関する項を参照してください。

  • switch文は、そのセレクタ式の値に応じて、制御を複数の文または式のいずれかに移します。パターン・マッチングをswitchに拡張すると、それぞれが特定のアクションを持つ複数のパターンに対して式をテストできるため、複雑なデータ指向の問合せを簡潔かつ安全に表現できます。このリリースでは:
    • カッコで囲まれたパターンが削除されました。
    • switch式および文のcase定数として修飾されたenum定数を使用できます。

    『JEP 441: Pattern Matching for switch』および『Java Platform, Standard Edition Java言語更新』switch式および文のパターン・マッチングに関する項を参照してください。

プレビュー言語機能

  • 文字列テンプレートは、リテラル・テキストと埋込み式およびテンプレート・プロセッサを結合して特殊な結果を生成することにより、Javaの既存の文字列リテラルおよびテキスト・ブロックを補完します。

    『JEP 430: String Templates (Preview)』および『Java Platform, Standard Edition Java言語更新』文字列テンプレートに関する項を参照してください。

  • 無名パターンは、コンポーネントの名前またはタイプを指定しないレコード・コンポーネントと一致します。無名変数は、初期化はできるが使用できない変数です。両方ともアンダースコア文字(_)で示します。

    『JEP 443: Unnamed Patterns and Variables (Preview)』および『Java Platform, Standard Edition Java言語更新』無名パターンおよび変数に関する項を参照してください。

  • 無名クラスおよびインスタンスのmainメソッドを使用すると、受講者は単一クラス・プログラムの合理化された宣言を記述し、後でプログラムをシームレスに拡張して、スキルの成長に合わせてより高度な機能を使用できます。

    『JEP 445: Unnamed Classes and Instance Main Methods (Preview)』および『Java Platform, Standard Edition Java言語更新』無名クラスおよびインスタンスのmainメソッドに関する項を参照してください。

プレビュー機能の詳細は、『Preview Language and VM Features』を参照してください。

ライブラリの改善

  • 仮想スレッドは、高スループットの同時アプリケーションの書込み、メンテナンスおよびデバッグの労力を減らす軽量スレッドです。

    『JEP 444: Virtual Threads』および『Java Platform, Standard Editionコア・ライブラリ』仮想スレッドに関する項を参照してください。

  • 順序付けられたコレクションは、定義済の検出順序を持つコレクションです。このようなコレクションにはそれぞれ、最初の要素、2番目の要素など、最後の要素まで明確に定義されています。順序付けられたコレクションを表すインタフェースであり、最初と最後の要素にアクセスするため、およびその要素を逆順に処理するための均一なAPIを提供します。

    『JEP 431: Sequenced Collections』および『Java Platform, Standard Editionコア・ライブラリ』順序付けられたコレクション、セットおよびマップの作成に関する項を参照してください。

  • キー・カプセル化メカニズムAPIは、公開キー暗号化を使用して対称キーをセキュリティ保護するための暗号化技術であるキー・カプセル化メカニズム(KEM)用に導入されています。

    『JEP 452: Key Encapsulation Mechanism API』および『Java Platform, Standard Editionセキュリティ開発者ガイド』KEMクラスに関する項を参照してください。

ライブラリ改善プレビューおよびインキュベーター

  • プレビューであるAPI外部関数およびメモリーAPIは、次のようにさらに改善されています:
    • Arenaインタフェースでネイティブ・セグメントの存続期間の管理を一元化
    • アドレス・レイアウトを間接参照するための新しい要素でレイアウト・パスを拡張
    • 存続期間が短く、Javaにアップコールされない関数へのコールを最適化するリンカー・オプションを提供(例: clock_gettime)
    • 移植を容易にするために、libffiに基づくフォールバック・ネイティブ・リンカー実装を提供
    • VaListクラスを削除
    『JEP 442: Foreign Function & Memory API (Third Preview)』および『Java Platform, Standard Editionコア・ライブラリ』外部関数およびメモリーAPIに関する項を参照してください。
  • 構造化並行性は、異なるスレッドで実行されている複数のタスクを1つの作業単位として処理することにより、エラーの処理と取消しを合理化し、信頼性と可観測性を向上させます。

    『JEP 453: Structured Concurrency (Preview)』および『Java Platform, Standard Editionコア・ライブラリ』構造化並行性に関する項を参照してください。

  • スコープ値を使用すると、スレッド内およびスレッド間で不変データを共有できます。多数の仮想スレッドを使用する場合は特に、スレッド・ローカル変数よりもこちらをお薦めします。

    『JEP 446: Scoped Values (Preview)』およびJava API仕様のScopedValueクラスを参照してください。

  • 実行時に、サポートされているCPUアーキテクチャ上で最適なベクトル命令に確実にコンパイルするベクトル計算を表現するために、Vector APIが導入されています。これにより、同等のスカラー計算よりも優れたパフォーマンスを実現できます。『JEP 448: Vector API (Sixth Incubator)』を参照してください。

プレビュー機能およびインキュベーションAPIの詳細は、『JEP 12: Preview Features』および『JEP 11: Incubator Modules』を参照してください。

パフォーマンスの向上

Zガベージ・コレクタ(ZGC)を拡張して、若いオブジェクトと古いオブジェクトの世代を分けて管理することで、アプリケーションのパフォーマンスが向上しました。これにより、ZGCは若いまま期限切れになる傾向がある若いオブジェクトをより頻繁に収集できます。

『JEP 439: Generational ZGC』および『Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイド』Zガベージ・コレクタに関する項を参照してください。

スチュワードシップ

エージェントが実行中のJVMに動的にロードされると、警告が発行されます。これらの警告は、デフォルトで整合性を向上させるために、エージェントの動的ロードをデフォルトで禁止する将来のリリースに備えることを目的としています。

『JEP 451: Prepare to Disallow the Dynamic Loading of Agents』を参照してください。

削除されたAPI、ツールおよびコンポーネント

削除および非推奨の詳細は、「JDK 21で削除および非推奨となった機能およびオプション」を参照してください。

また、注意が必要なセキュリティ関連の更新もあります。「JDK 21でのセキュリティ・アップデート」を参照してください。