2 JDKにおける重要な変更
アプリケーションを最新のJDKリリースに移行する前に、最新のJDKリリースと以前のJDKリリース間における更新内容および変更点について理解する必要があります。JDK 8から移行する場合は、JDK 8と後続リリースとの間の相違点(「JDK 8から後続のJDKリリースへの移行」を参照)についてよく理解しておくことも必要です。
最新のJDKリリースにおけるいくつかの重要な変更を確認するには、次の各項を参照してください。
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モジュールの削除」を参照してください。