2 JDKにおける重要な変更
アプリケーションを最新のJDKリリースに移行する前に、最新のJDKリリースと以前のJDKリリース間における更新内容および変更点について理解する必要があります。JDK 8から移行する場合は、JDK 8と後続リリースとの間の相違点(「JDK 8から後続のJDKリリースへの移行」を参照)についてよく理解しておくことも必要です。
最新のJDKリリースにおけるいくつかの重要な変更を確認するには、次の各項を参照してください。
JDK 19リリースにおける重要な変更
JDK 19の新機能と拡張機能、およびAPI仕様の詳細は、JDK 19リリース・ノートを参照してください。
Java SE 19およびJDK 19の更新内容の一部を次に示します:
同時実行モデル更新のプレビュー
- 仮想スレッドは、高スループットの同時アプリケーションの書込み、メンテナンスおよびデバッグの労力を減らす軽量スレッドです。これはプレビューAPIです。『JEP 425: Virtual Threads (Preview)』および『Java Platform, Standard Editionコア・ライブラリ』の仮想スレッドに関する項を参照してください。
- 構造化並行性のためのマルチスレッド・プログラミングを簡略化するために、APIが導入されました。構造化並行性は、異なるスレッドで実行されている複数のタスクを1つの作業単位として処理することにより、エラーの処理と取消しを合理化し、信頼性と可観測性を向上させます。『JEP 428: Structured Concurrency (Incubator)』を参照してください。
言語の変更
- このリリースでは、レコード・パターンがプレビュー機能として導入されています。レコード・パターンは、タイプ、対応するレコード・コンポーネントとのマッチングに使用されるレコード・コンポーネント・パターン・リスト、およびオプションの識別子で構成されます。レコード・パターンとタイプ・パターンをネストすると、強力で宣言的かつ組立て可能な形式のデータのナビゲーションや処理が可能になります。『JEP 405: Record Patterns (Preview)』および『Java Platform, Standard Edition Java言語更新』のレコード・パターンに関する項を参照してください。
- このリリースでは、プレビュー機能である
switch
式および文のパターン・マッチングが再プレビューされています。この機能を使用すると、それぞれが特定のアクションを持つ複数のパターンに対して式をテストできるため、複雑なデータ指向の問合せを簡潔かつ安全に表現できます。『JEP 427: Pattern Matching for switch (Third Preview)』および『Java Platform, Standard Edition Java言語更新』のswitch式および文のパターン・マッチングに関する項を参照してください。
ライブラリの変更点
- 外部関数およびメモリーAPIを使用すると、JavaプログラムはJavaランタイムの外部のコードおよびデータと相互運用できます。このAPIにより、Javaプログラムは、JNIの脆弱性と危険性を伴わずにネイティブ・ライブラリをコールしてネイティブ・データを処理できます。APIは、外部関数(JVM外部のコード)を起動し、JVMによって管理されていない外部メモリーに安全にアクセスします。これはプレビューAPIです。『JEP 424: Foreign Function & Memory API (Preview)』および『Java Platform, Standard Editionコア・ライブラリ』の外部関数およびメモリーAPIに関する項を参照してください。
- 実行時に、サポートされているCPUアーキテクチャ上で最適なベクトル命令に確実にコンパイルするベクトル計算を表現するために、Vector APIが導入されています。これにより、同等のスカラー計算よりも優れたパフォーマンスを実現できます。『JEP 426: Vector API (Fourth Incubator)』を参照してください。
削除されたAPI、ツールおよびコンポーネント
削除および非推奨の詳細は、「JDK 19で非推奨となった機能およびオプション」を参照してください。
また、注意が必要なセキュリティ関連の更新もあります。「JDK 19でのセキュリティ・アップデート」を参照してください。
JDK 18リリースにおける重要な変更
JDK 18の新機能と拡張機能、およびAPI仕様の詳細は、JDK 18リリース・ノートを参照してください。
Java SE 18およびJDK 18の更新内容の一部を次に示します:
ツール
- 新しいコマンドライン・ツール
jwebserver
を使用すると、静的ファイルを処理する最小限のWebサーバーを起動できます。このツールは、プロトタイプ作成やテストに役立ちます。JEP 408: 単純なWebサーバーに関する項を参照してください。 @snippet
タグがJavaDocの標準ドックレットに追加され、APIドキュメントにソース・コード例を含めるのが簡単になります。JEP 413: Java APIドキュメントのコード・スニペットに関する項およびスニペットのプログラマーズ・ガイドを参照してください。
ライブラリの変更点
- UTF-8がJava SE APIのデフォルトの文字セットになりました。この変更により、デフォルトの文字セットに依存するAPIは、すべての実装、オペレーティング・システム、ロケールおよび構成にわたって一貫性のある動作をします。JEP 400: デフォルトのUTF-8に関する項および「デフォルトの文字セット」を参照してください。
java.net.InetAddress
がプラットフォームの組込みリゾルバ以外のリゾルバを使用できるように、ホスト名およびアドレス解決用にサービス・プロバイダ・インタフェース(SPI)が定義されます。JEP 418: インターネット・アドレス解決SPIに関する項を参照してください。jdk.net.hosts.file
システム・プロパティの詳細は、『Java Platform, Standard Editionコア・ライブラリ』のホスト名からIPアドレスへのマッピングの指定に関する項も参照してください。これにより、システム全体のリゾルバではなく特定のhosts
ファイルを使用するようにInetAddressを構成して、ホスト名をIPアドレスにマップできます。- メソッド・ハンドルのコア・リフレクションが再実装されました。これにより、
java.lang.reflect
APIとjava.lang.invoke
APIの両方のメンテナンスおよび開発コストが削減されます。JEP 416: メソッド・ハンドルによるコア・リフレクションの再実装に関する項を参照してください。
機能およびインキュベータ・モジュールのプレビュー
プレビュー機能の詳細はJEP 12: プレビュー機能に関する項を、インキュベータ・モジュールの詳細はJEP 11: インキュベータ・モジュールに関する項を参照してください。
- このリリースでは、プレビュー機能である
switch
式および文のパターン・マッチングが再プレビューされています。この機能を使用すると、それぞれが特定のアクションを持つ複数のパターンに対して式をテストできるため、複雑なデータ指向の問合せを簡潔かつ安全に表現できます。JEP 420: switchのパターン・マッチング(セカンド・プレビュー)に関する項および『Java Platform, Standard Edition Java言語更新』のswitch式および文のパターン・マッチングに関する項を参照してください。 - Java SE 17で導入された外部関数およびメモリーAPIを使用すると、JavaプログラムをJavaランタイム外のコードおよびデータと相互運用できます。このリリースでは、APIが機能改善とともに再導入されています。JEP 419: 外部関数およびメモリーAPI (セカンド・インキュベータ)に関する項を参照してください。
- ベクターAPIは、インキュベーションAPIとしてJava SE 16で導入されました。このリリースでは、APIは機能強化とパフォーマンスの改善により再導入されています。JEP 417: ベクターAPI (サード・インキュベータ)に関する項を参照してください。
削除されたAPI、ツールおよびコンポーネント
削除および非推奨の詳細は、次を参照してください:
また、注意が必要なセキュリティ関連の更新もあります。「JDK 18でのセキュリティ・アップデート」を参照してください。
JDK 17リリースにおける重要な変更
JDK 17の新機能と拡張機能、およびAPI仕様の詳細は、JDK 17リリース・ノートを参照してください。
Java SE 17およびJDK 17の更新内容の一部を次に示します:
言語の新機能
- Java SE 15で最初にプレビューされたシール・クラスは、このリリースで永続的な機能になりました。シール・クラスおよびインタフェースは、それらを拡張または実装できる他のクラスまたはインタフェースを制限します。JEP 409: シール・クラスに関する項および『Java Platform, Standard Edition Java言語更新』ガイドのシール・クラスに関する項を参照してください。
ライブラリの変更点
- アプリケーションは、JVM全体のフィルタ・ファクトリを使用して、コンテキスト固有の動的に選択されたデシリアライズ・フィルタを構成できるようになりました。これは、個々のデシリアライズ操作ごとにフィルタを選択するために起動されます。JEP 415: コンテキスト固有のデシリアライズ・フィルタに関する項および『Java Platform, Standard Editionコア・ライブラリ』ガイドのシリアライズ・フィルタリングに関する項を参照してください。
- ジャンプ可能なPRNGや分割可能なPRNGアルゴリズム(LXM)の追加クラスなど、擬似乱数ジェネレータ(PRNG)の新しいインタフェース・タイプおよび実装が使用できるようになりました。JEP 356: 擬似乱数ジェネレータの強化に関する項および『Java Platform, Standard Editionコア・ライブラリ』ガイドの擬似乱数ジェネレータに関する項を参照してください。
- macOS用の新しいJava 2D内部レンダリング・パイプラインは、Apple Metal APIを使用して実装されます。これは、非推奨のApple OpenGL APIを使用する既存のパイプラインの代替手段です。JEP 382: 新しいmacOSレンダリング・パイプラインに関する項を参照してください。
その他の変更点
- デフォルトでは、
sun.misc.Unsafe
などの重要な内部APIを除き、JDKのすべての内部要素が強くカプセル化されます。ただし、JDK 9からJDK 16まで可能であった、単一のコマンドライン・オプションを使用した内部要素の強力なカプセル化の緩和はできなくなります。JEP 403: デフォルトでのJDK内部の強力なカプセル化に関する項を参照してください。 - 浮動小数点演算は、厳密な浮動小数点セマンティクス(
strictfp
)と微妙に異なるデフォルトの浮動小数点セマンティクスの両方を持つのではなく、一貫して厳密になりました。JEP 306: 常に厳密な浮動小数点セマンティクスのリストアに関する項を参照してください。
非推奨
- セキュリティ・マネージャおよびそれに関連するAPIは、将来のリリースでの削除のために非推奨になりました。JEP 411: 削除のためのセキュリティ・マネージャの非推奨化に関する項を参照してください。
機能およびインキュベータ・モジュールのプレビュー
プレビュー機能の詳細はJEP 12: プレビュー機能に関する項を、インキュベータ・モジュールの詳細はJEP 11: インキュベータ・モジュールに関する項を参照してください。
- このリリースでは、
switch
式および文のパターン・マッチングが導入されています。 この機能を使用すると、それぞれが特定のアクションを持つ複数のパターンに対して式をテストできるため、複雑なデータ指向の問合せを簡潔かつ安全に表現できます。JEP 406: switchのパターン・マッチング(プレビュー)に関する項および『Java Platform, Standard Edition Java言語更新』ガイドのSwitch式および文のパターン・マッチングに関する項を参照してください。 - 外部関数およびメモリーAPIを使用すると、JavaプログラムはJavaランタイムの外部のコードおよびデータと相互運用できます。JEP 412: 外部関数およびメモリーAPI (インキュベータ)に関する項を参照してください。
- ベクターAPIは、インキュベーションAPIとしてJava SE 16で導入されました。このリリースでは、機能拡張がパフォーマンス向上とともに組み込まれています。JEP 414: ベクターAPI (セカンド・インキュベータ)に関する項を参照してください。
JDK 16リリースにおける重要な変更
JDK 16の新機能と拡張機能、およびAPI仕様の詳細は、JDK 16リリース・ノートを参照してください。
Java SE 16およびJDK 16の更新内容の一部を次に示します:
- Javaプログラミング言語は、
instanceof
演算子のパターン一致で拡張されています。この機能を使用すると、プログラム内の共通ロジック(オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に表現できます。JEP 394: instanceofのパターン一致に関する項および『Java Platform, Standard Edition Java言語更新』のinstanceofのパターン一致に関する項を参照してください。 - Java SE 14で最初にプレビューされたレコードは、このリリースの永続的な機能です。以前の制限は緩和されており、内部クラスは明示的または暗黙的に静的なメンバーを宣言できます。これには、暗黙的に静的なレコード・クラス・メンバーが含まれます。JEP 395: レコードに関する項および『Java Platform, Standard Edition Java言語更新』ガイドのレコード・クラスに関する項を参照してください。
- デフォルトでは、
sun.misc.Unsafe
などの重要な内部APIを除き、JDKのすべての内部要素が強くカプセル化されます。JDK 9以降、デフォルトになっている緩和された強力なカプセル化を選択できます。JEP 396: デフォルトでのJDK内部の強力なカプセル化に関する項および「JDK内の強力なカプセル化」を参照してください。 - UNIXドメイン・ソケット・チャネルがJDK 16に統合されました。JEP 380: UNIXドメイン・ソケット・チャネルに関する項および『Java Platform, Standard Editionコア・ライブラリ』のインターネット・プロトコルとUNIXドメイン・ソケットのNIOの例に関する項を参照してください。
- Zガベージ・コレクタはスレッド・スタックを同時に処理します。これにより、JVM内のすべてのルートを同時にZGCで処理できます。JEP 376: ZGC: 同時スレッド・スタック処理に関する項および『Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイド』のZガベージ・コレクタに関する項を参照してください。
- JDK 14で導入された
jpackage
ツールは、現在永続的な機能です。このツールは、必要な依存関係を含むプラットフォーム固有のパッケージにJavaアプリケーションをパッケージ化します。JEP 392: パッケージング・ツールに関する項および『Java Platform, Standard Editionパッケージング・ツール・ユーザーズ・ガイド』を参照してください。 - エラスティック・メタスペースは、VM内部のメタスペースおよびクラス・スペース実装を改善したものです。未使用のHotSpotクラス・メタデータ(メタスペース)メモリーがオペレーティング・システムに返されます。メンテナンス・コストを削減するために、メタスペース・フットプリントを削減し、メタスペース・コードを簡略化します。JEP 387: エラスティック・メタスペースに関する項を参照してください。
機能およびインキュベータ・モジュールのプレビュー
プレビュー機能の詳細は、Java言語のプレビュー機能を参照してください。
- シール・クラス(JDK 15のプレビュー機能)は、このリリースで再プレビューされます。シール・クラスおよびインタフェースは、それらを拡張または実装できる他のクラスまたはインタフェースを制限します。このリリースには、コンテキスト・キーワードとしての文字シーケンス
sealed
、non-sealed
およびpermits
の導入など、いくつかの改良点があります。JEP 397: シール・クラス(2度目のプレビュー)に関する項および『Java Platform, Standard Edition Java言語更新』のシール・クラスに関する項を参照してください。 - ベクター計算を表すために、インキュベータ・モジュール
jdk.incubator.vector
の初期反復が提供されています。実行時に、サポートされているCPUアーキテクチャで最適なベクター・ハードウェア命令に確実にコンパイルされるため、同等のスカラー計算に対して優れたパフォーマンスが実現されます。JEP 338: ベクターAPI (インキュベータ)に関する項を参照してください。 - 静的に型を指定した、ネイティブ・コードへのpure-Javaアクセスを提供する外部リンカーAPIが導入されました。このAPIは、外部メモリー・アクセスAPI (JEP 393)とともに、ネイティブ・ライブラリへのバインドに関する他のエラーが発生しやすいプロセスを簡略化します。JEP 389: 外部リンカーAPI (インキュベータ)に関する項を参照してください。
- 外部メモリー・アクセスAPIを使用すると、JavaプログラムはJavaヒープ外の外部メモリーに効率的かつ安全にアクセスできます。JEP 393: 外部メモリー・アクセスAPI (サード・インキュベータ)に関する項を参照してください。
JDK 15リリースにおける重要な変更
JDK 15の新機能および拡張機能の完全なリストは、JDK 15リリース・ノートを参照してください。
次に示すのは、Java SE 15およびJDK 15での更新内容の一部です。
- Java SE 13で最初にプレビューされたテキスト・ブロックは、このリリースで永続的な機能となり、プレビュー機能を有効にせずに使用できます。
テキスト・ブロックは、大部分のエスケープ・シーケンスの必要性を回避し、文字列を予測可能な方法で自動的に書式設定する複数行の文字列リテラルであり、必要に応じて開発者が書式を制御できます。『JEP 378: Text Blocks』および『テキスト・ブロック・プログラマーズ・ガイド』を参照してください。
- Zガベージ・コレクタ(ZGC)は本番で使用する準備ができ、実験的な機能ではなくなりました。ZGCを有効にするには、コマンドライン・オプション
-XX:+UseZGC
を使用します。『JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production)』を参照してください。 - 非表示クラスは、他のクラスのバイトコードで直接使用できないクラスです。非表示クラスは、実行時にクラスを生成し、リフレクションを介して間接的に使用するフレームワークで使用することを目的としています。『JEP 371: Hidden Classes』を参照してください。
プレビューおよびインキュベータ機能
プレビュー機能の詳細は、Java言語のプレビュー機能を参照してください。
- シール・クラスは、Java言語のプレビュー機能です。シール・クラスおよびインタフェースは、それらを拡張または実装できる他のクラスまたはインタフェースを制限します。『JEP 360: Sealed Classes (Preview)』および『Java Platform, Standard Edition Java言語更新』のシール・クラスを参照してください。
- Java SE 14のプレビュー機能である
instanceof
のパターン一致は、このリリースで再プレビューされます。この機能を使用すると、プログラム内の共通ロジック(オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に表現できます。『JEP 375: Pattern Matching for instanceof (Second Preview)』および『Java Platform, Standard Edition Java言語更新』のパターン一致を参照してください。 - Java SE 14のプレビュー機能であるレコードは、このリリースで再プレビューされます。レコードは、不変データの透過的キャリアとして機能するクラスです。『JEP 384: Records (Second Preview)』および『Java Platform, Standard Edition Java言語更新』のレコード・クラスを参照してください。
- 外部メモリー・アクセスAPIを使用すると、JavaプログラムはJavaヒープ外の外部メモリーに効率的かつ安全にアクセスできます。『JEP 383: Foreign-Memory Access API (Second Incubator)』を参照してください。
JDK 14リリースにおける重要な変更
次に示すのは、Java SE 14およびJDK 14での変更点の一部です:
- switchは文または式として使用できるように拡張されたため、両方のフォームは、switch式から値を生成するための追加の新しい文とともに従来の
case ... :
ラベル(フォール・スルーあり)または新しいcase ... ->
ラベル(フォール・スルーなし)のいずれかを使用できます。『JEP 361: Switch Expressions (Standard)』および「Java言語の変更」を参照してください。 - G1は、不均一メモリー・アクセス(NUMA)メモリー・システムでの割当てパフォーマンスを向上させるために強化されています。『JEP 345: NUMA-Aware Memory Allocation for G1』を参照してください。
- JDKフライト・レコーダ・データが、連続したモニタリングを可能にするデータ・ストリームとして使用できるようになりました。『JEP 349: JFR Event Streaming』を参照してください。
- 新しいJDK固有のファイル・マッピング・モードが追加され、不揮発(NVM)メモリーを参照する
MappedByteBuffer
インスタンスをFileChannel
APIを使用して作成できるようになりました。『JEP 352: Non-Volatile Mapped Byte Buffers』を参照してください。 - 通貨の書式をロケール固有の会計書式で設定できます。たとえば、-$3.27ではなく($3.27)などです。『Accounting Currency Format Support』を参照してください。
- コンテナ環境など、現在のオペレーティング環境を基に値がレポートされるように、
com.sun.management.OperatingSystemMXBean
が拡張されました。オペレーティング・システムに関する情報を取得するツール用のMXBeanが、コンテナ環境で改善されています。『OperatingSystemMXBean made container aware』を参照してください。
実験的、プレビューおよびインキュベータ機能
Records
はJava言語のプレビュー機能であり、様々な不変データに対して透過的なホルダーであるクラスを宣言するためのコンパクトな構文を提供します。『JEP 359: Records (Preview)』を参照してください。instanceof
のパターン一致は、instanceof-and-cast
イディオムを簡略化するJavaの言語プレビュー機能です。『JEP 305: Pattern Matching for instanceof (Preview)』を参照してください。- テキスト・ブロックは、大部分のエスケープ・シーケンスの必要性を回避し、文字列を予測可能な方法で自動的に書式設定する複数行の文字列リテラルであり、必要に応じて開発者が書式を制御できます。テキスト・ブロックは、JDK 13でプレビュー機能として導入されました。JDK 14で、2つの新しいエスケープ・シーケンスを追加してテキスト・ブロックを再度プレビューしています。『JEP 368: Text Blocks (Second Preview)』を参照してください。
jpackage
は、自己完結型Javaアプリケーションをパッケージ化するための単純なツールです。『JEP 343: Packaging Tool (Incubator)』を参照してください。- Javaプログラムが、Javaヒープ外部の外部メモリーに効率的にアクセスできるようにするAPIが導入されました。『JEP 370: Foreign-Memory Access API (Incubator)』を参照してください。
- 以前はLinuxでのみ使用可能だったZガベージ・コレクタ(ZGC)は、WindowsとmacOSで実験的機能として導入されました。『JEP 364: ZGC on macOS』および『JEP 365: ZGC on Windows』を参照してください。
JDK 13リリースにおける重要な変更
次に示すのは、Java SE 13およびJDK 13での重要な拡張機能の一部です。
- 動的CDSアーカイブは、アプリケーション・クラスデータ共有(ApsCDS)を拡張します。これにより、Javaアプリケーションの終了時にクラスの動的アーカイブが可能になります。『JEP 350: Dynamic CDS Archives』を参照してください。
- テキスト・ブロックがJava言語に追加され、開発者が必要に応じてフォーマットを制御できるようになりました。これはプレビュー言語機能です。『JEP 355 Text Blocks (Preview)』および『JEP 12: Preview Language and VM Features』を参照してください。
switch
式、プレビュー言語機能は、文または式として使用できるように拡張されたため、両方のフォームで従来のラベル(フォール・スルーあり)または新しいラベル(フォール・スルーなし)のいずれかを使用できるようになりました。これは、switch
式から値を生成するための追加の新しい文とともに使用されます。『JEP 354: Switch Expressions (Preview)』および『JEP 12: Preview Language and VM Features』を参照してください。java.net.Socket
およびjava.net.ServerSocket
APIで使用される実装は、管理やデバッグが容易で、より単純な最新の実装に置き換えられました。『JEP 353: Reimplement the Legacy Socket API』を参照してください。- Unicode 12.1のサポート。Unicode 12.1に関する項を参照してください。
- ZGCは、未使用のヒープ・メモリーをオペレーティング・システムに戻すように拡張されており、アプリケーションのメモリー・フットプリントを拡張します。『JEP 351 ZGC Uncommit Unused Memory』を参照してください。
JDK 12リリースにおける重要な変更
次に示すのは、Java SE 12およびJDK 12での重要な追加および更新内容の一部です。
- JVM Constants APIが導入され、主要なクラス・ファイルおよびランタイム・アーティファクト、特に定数プールからロード可能な定数の名目的記述のモデル化に対応しています。JVM Constant APIに関する項を参照してください。
switch
文が拡張され、文または式として使用できるようになりました。これはプレビュー言語機能です。『JEP 325: Switch Expressions (Preview)』および『JEP 12: Preview Language and VM Features』を参照してください。- Unicode 11.0のサポート。Unicode 11.0に関する項を参照してください。
- 2019年5月から開始される日本の令和元号に対応する組文字のサポートが提供されました。組文字のサポートに関する項を参照してください。
NumberFormat
に、数値を簡潔な形式で書式設定するためのサポートが追加されました。簡潔な数値書式のサポートに関する項を参照してください。
JDK 11リリースにおける重要な変更
JDK 11にも、いくつかの重要な変更がありました。JDK 11は長期サポート(LTS)リリースであるため、JDK 11リリースにおける次の重要な変更を理解しておく必要があります。
-
JREおよびServer JREのダウンロードが提供されなくなったため、今後は自動更新を使用できません。
-
Java Web Start、JavaプラグインおよびJavaコントロール・パネルはJDKで提供されません。「デプロイメント・スタックの削除」を参照してください。
-
JavaFXはJDKで提供されなくなりました。現在は、https://openjfx.io/から個別のダウンロードとして入手できます。
-
JAXBおよびJAX-WSはJDKにバンドルされなくなりました。「Java EEおよびCORBAモジュールの削除」を参照してください。