1 Java言語の変更

この項では、Java SE 9以降のリリースで更新された言語機能の概要を示します。

Java SE 19のJava言語の変更

機能 説明 JEP
switch式および文のパターン・マッチング

このリリースでは、Java SE 17のプレビュー機能が再度プレビューされました。

このリリース:

  • ガード付きパターン・ラベルの構文は、パターンとwhen句で構成されます。
  • セレクタ式がnullと評価されたときに、switchブロックにnullケース・ラベルが含まれない場合、パターン・ラベルがnull値の型と一致していても、NullPointerExceptionがスローされます。
  • switch式または文が完了時に網羅的だが、実行時にはそうでない場合、MatchExceptionがスローされます。
JEP 427: switchのパターン・マッチング(3度目のプレビュー)
レコード・パターン

このリリースではプレビュー機能として導入されました。

レコード・パターンは、タイプ、レコード・コンポーネント・パターン・リスト(対応するレコード・コンポーネントとの照合に使用)、およびオプションの識別子で構成されます。レコード・パターンとタイプ・パターンをネストさせ、強力で宣言的、かつ構成可能なデータ・ナビゲーションと処理を実現できます。

JEP 405: レコード・パターン(プレビュー)

Java SE 18のJava言語の変更

機能 説明 JEP
switch式および文のパターン・マッチング

このリリースでは、Java SE 17のプレビュー機能が再度プレビューされました。

このリリース:

  • 優位性チェックで、定数ラベルがガイド付きパターン・ラベルの前に記述され、ガイド付きパターン・ラベルがガイド付きではないタイプのパターン・ラベルの前に記述されるよう強制されます。switch式および文のパターン・マッチングの「パターン・ラベルの優位性」を参照してください。
  • 網羅性チェックが拡張され、汎用シール・クラスを考慮し、switch式が確認されるようになりました。switch式および文のパターン・マッチングの「switch式およびswitch文におけるカバレッジ・タイプ」とswitch式の「switch文の網羅性」を参照してください。
JEP 420: switchのパターン・マッチング(2度目のプレビュー)

Java SE 17のJava言語の変更

機能 説明 JEP
シール・クラス

Java SE 15で最初にプレビューされたこの機能は、このリリースで永続的になりました。つまり、プレビュー機能を有効にしなくても、Java SE 17用にコンパイルされた任意のプログラムで使用できます。

シール・クラスまたはインタフェースは、拡張または実装できるクラスまたはインタフェースを制限します。

JEP 409: シール・クラス
switch式および文のパターン・マッチング

このリリースではプレビュー機能として導入されました。

switch式および文のパターン・マッチングを使用すると、それぞれが特定のアクションを持つ複数のパターンに対して式をテストできるため、複雑なデータ指向の問合せを簡潔かつ安全に表現できます。

JEP 406: switchのパターン・マッチング(プレビュー)

Java SE 16のJava言語の変更

機能 説明 JEP
シール・クラス

このリリースでは、Java SE 15のプレビュー機能が再度プレビューされました。シール・タイプ階層に対する参照型の縮小変換のより厳密なチェックなど、いくつかの改良により強化されています。

シール・クラスまたはインタフェースは、拡張または実装できるクラスまたはインタフェースを制限します。
JEP 397: シール・クラス(2番目のプレビュー)
レコード・クラス

Java SE 14で最初にプレビューされたこの機能は、このリリースで永続的になりました。つまり、プレビュー機能を有効にしなくても、Java SE 16用にコンパイルされた任意のプログラムで使用できます。

このリリースでは、明示的または暗黙的に静的なメンバーを内部クラスで宣言できます。これには、暗黙的に静的なレコード・クラス・メンバーが含まれます。

レコードは、不変データの透過的なキャリアとして機能するクラスです。

JEP 395: レコード
instanceofのパターン・マッチング

Java SE 14で最初にプレビューされたこの機能は、このリリースで永続的になりました。つまり、プレビュー機能を有効にしなくても、Java SE 16用にコンパイルされた任意のプログラムで使用できます。

このリリースでは、パターン変数は暗黙的にfinalではなくなり、パターンinstanceof式でS型の式をT型のパターンと比較すると、コンパイル時エラーになります。STのサブタイプです。

パターン・マッチングを使用すると、プログラム内の一般的なロジック(オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に表現できます。

JEP 394: instanceofのパターン・マッチング

Java SE 15のJava言語の変更

機能 説明 JEP
シール・クラス

このリリースではプレビュー機能として導入されました。

シール・クラスまたはインタフェースは、拡張または実装できるクラスまたはインタフェースを制限します。

JEP 360: シール・クラス(プレビュー)
レコード・クラス

このリリースでは、Java SE 14のプレビュー機能が再度プレビューされました。ローカル・レコードをサポートするように拡張されました。

レコードは、不変データの透過的なキャリアとして機能するクラスです。

JEP 384: レコード(2度目のプレビュー)
instanceofのパターン・マッチング

このリリースでは、Java SE 14のプレビュー機能が再度プレビューされました。Java SE 14とこのリリースの間では変更されていません。

パターン・マッチングを使用すると、プログラム内の一般的なロジック(オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に表現できます。

JEP 375: instanceofのパターン・マッチング(2度目のプレビュー)

テキスト・ブロック

テキスト・ブロックのプログラマーズ・ガイドも参照してください

Java SE 13で最初にプレビューされたこの機能は、このリリースで永続的になりました。つまり、プレビュー機能を有効にしなくても、Java SE 15用にコンパイルされた任意のプログラムで使用できます。

テキスト・ブロックは、大部分のエスケープ・シーケンスの必要性を回避し、文字列を予測可能な方法で自動的に書式設定する複数行の文字列リテラルであり、必要に応じて開発者が書式を制御できます。

JEP 378: テキスト・ブロック

Java SE 14のJava言語の変更

機能 説明 JEP
instanceof演算子のパターン・マッチング

このリリースではプレビュー機能として導入されました。

パターン・マッチングを使用すると、プログラム内の一般的なロジック(オブジェクトからのコンポーネントの条件付き抽出)をより簡潔かつ安全に表現できます。

JEP 305: instanceofのパターン・マッチング(プレビュー)JEP 305: instanceofのパターン・マッチング(プレビュー)
レコード

このリリースではプレビュー機能として導入されました。

レコードは、様々な不変データに対して透過的なホルダーであるクラスを宣言するためのコンパクトな構文を提供します。

JEP 359: レコード(プレビュー)

テキスト・ブロック

テキスト・ブロックのプログラマーズ・ガイドも参照してください

このリリースでは、Java SE 13のプレビュー機能が再度プレビューされました。より多くのエスケープ・シーケンスがサポートされるように拡張されました。

テキスト・ブロックは、大部分のエスケープ・シーケンスの必要性を回避し、文字列を予測可能な方法で自動的に書式設定する複数行の文字列リテラルであり、必要に応じて開発者が書式を制御できます。

JEP 375: instanceofのパターン・マッチング(2度目のプレビュー)
switch式

Java SE 12で最初にプレビューされたこの機能は、このリリースで永続的になりました。つまり、プレビュー機能を有効にしなくても、Java SE 14用にコンパイルされた任意のプログラムで使用できます。

この機能によりswitchは文または式として使用できるように拡張されたため、両方のフォームで、switch式から値を生成するための追加の新しい文とともに、従来のcase ... :ラベル(フォール・スルーあり)または新しいcase ... ->ラベル(フォール・スルーなし)のいずれかを使用できます。

JEP 361: switch式(標準)

Java SE 13のJava言語の変更

機能 説明 JEP
テキスト・ブロック。テキスト・ブロックのプログラマーズ・ガイドを参照してください。

このリリースではプレビュー機能として導入されました。

テキスト・ブロックは、大部分のエスケープ・シーケンスの必要性を回避し、文字列を予測可能な方法で自動的に書式設定する複数行の文字列リテラルであり、必要に応じて開発者が書式を制御できます。

JEP 355: テキスト・ブロック(プレビュー)
switch式

このリリースでは、Java SE 12のプレビュー機能が再度プレビューされました。次の1つが変更されて拡張されました: switch式の値を指定するには、break文のかわりに新しいyield文を使用します。

この機能によりswitchは文または式として使用できるように拡張されたため、両方のフォームで、switch式から値を生成するための追加の新しい文とともに、従来のcase ... :ラベル(フォール・スルーあり)または新しいcase ... ->ラベル(フォール・スルーなし)のいずれかを使用できるようになりました。

JEP 354: switch式(2度目のプレビュー)

Java SE 12のJava言語の変更

機能 説明 JEP
switch式

このリリースではプレビュー機能として導入されました。

この機能によりswitch文は文または式として使用できるように拡張されたため、両方のフォームで従来のスコープ指定または簡略化されたスコープ指定のいずれかを使用でき、フロー動作を制御できるようになりました。

JEP 325: switch式(プレビュー)

Java SE 11のJava言語の変更

機能 説明 JEP

ローカル変数の型推論

ローカル変数の型推論: スタイル・ガイドラインも参照してください。

Java SE 10で導入されました。このリリースでは、暗黙的に型指定されるラムダ式の仮パラメータを宣言するときにvarを使用できるようにするためのサポートが強化されました。

ローカル変数の型推論は、初期化子を伴うローカル変数宣言に型推論を拡張します。

Java SE 10のJava言語の変更

機能 説明 JEP

ローカル変数の型推論

ローカル変数の型推論: スタイル・ガイドラインも参照してください。

このリリースで導入されました。

ローカル変数の型推論は、初期化子を伴うローカル変数宣言に型推論を拡張します。

JEP 286: ローカル変数の型推論

Java SE 9のJava言語の変更

機能 説明 JEP

Javaプラットフォーム・モジュール・システム。OpenJDKのProject Jigsawを参照してください。

このリリースで導入されました。

Java Platformモジュール・システムでは、モジュールという新しい種類のJavaプログラミング・コンポーネントが導入されています。モジュールは名前付きで自己記述型のコードとデータのコレクションです。タイプ(Javaのクラスとインタフェース)を含むパッケージのセットとしてコードが編成されており、リソースおよび他の種類の静的情報がデータに含まれます。モジュールはパッケージをエクスポートまたはカプセル化でき、他のモジュールに対する依存関係を明示的に表現できます。

Java Platform Module System (JSR 376)

言語の小さな機能拡張(Project Coin):

Java SE 7では、Project Coinとして導入されました。これはいくつかの修正で拡張されています。

JEP 213: Milling Project Coin

JSR 334: Javaプログラミング言語の小規模な機能拡張

さらに簡潔になったtry-with-resources文

finalとしてのリソースがすでにあるか、実質的にfinalの変数がある場合、新しい変数を宣言せずにその変数をtry-with-resources文で使用できます。「事実上final」の変数とは、初期化された後に値が変更されることがない変数のことです。

たとえば、次の2つのリソースを宣言したとします。

        // A final resource
        final Resource resource1 = new Resource("resource1");
        // An effectively final resource
        Resource resource2 = new Resource("resource2");

Java SE 7または8では、次のように新しい変数を宣言します。

        try (Resource r1 = resource1;
             Resource r2 = resource2) {
            ...
        }

Java SE 9では、r1およびr2を宣言する必要はありません。

// New and improved try-with-resources statement in Java SE 9
        try (resource1;
             resource2) {
            ...
        }

the try-with-resources文の詳細な説明は、Javaチュートリアル(Java SE 8以前)を参照してください。

プライベート・インスタンス・メソッドで許可される@SafeVarargsの注釈

@SafeVarargsの注釈がプライベート・インスタンス・メソッドで許可されます。これは、オーバーライドできないメソッドのみに適用できます。これらには、静的メソッド、finalインスタンスのメソッド、およびプライベート・インスタンスのメソッド(Java SE 9の新機能)が含まれます。

ダイアモンド構文および匿名内部クラス

匿名内部クラスと一緒にダイアモンド構文(山カッコが含まれた構文)を使用できます。Javaプログラムで記述できる型(intStringなど)は型指定型と呼ばれます。Javaプログラムに記述できないコンパイラ内部の型は非型指定型と呼ばれます。

非型指定型は、ダイアモンド演算子で使用される推論の結果として発生する場合があります。匿名クラスのコンストラクタを指定したダイアモンドを使用する推論型はクラス・ファイルの署名属性の型セット以外になる可能性があるため、匿名クラスが指定されたダイアモンドの使用はJava SE 7では許可されていませんでした。

アンダースコア文字は正当な名前ではない

アンダースコア文字("_")を識別子として使用すると、ソース・コードをコンパイルできなくなります。

プライベート・インタフェース・メソッドのサポート

プライベート・インタフェースのメソッドがサポートされます。このサポートにより、インタフェースの非抽象メソッド間でコードを共有できるようになります。