JavaRush /Java Blog /Random-JA /Java 14: 新機能は何ですか?

Java 14: 新機能は何ですか?

Random-JA グループに公開済み
世界の問題は世界の問題であり、新しい Java は予定通りに進んでいます。つまり、ちょうど 6 か月に 1 回です。Java 14 のリリース バージョンは 3 月 17 日にリリースされ、開発者向けの言語にいくつかの興味深い革新が導入されました。 その中には、レコードJava 14: 新機能は何ですか?  - 1キーワードの実験的なサポート、「 instanceof 」演算子でのパターン マッチングのサポート、よりユーザー フレンドリーなNullPointerExceptions 、テキスト ブロックの拡張された「プレビュー」、更新されたデフォルトスイッチなどが含まれます。Java のすべてのイノベーションは拡張提案 ( JEP、Java Enhancement Proposals )から始まることを思い出してください。開発者が変更を提案し、「公式」Java 親によってレビューされ、それらの変更の一部が受け入れられ、その後 JDK の一部になります。そして今、すべてが順調に進んでいます。

JEP 359: 記録

レコード (レコードとも呼ばれます) は、JDK 14 のプレビュー モードで使用できます。これは Java にとってまったく新しい機能です。実際、私たちの前にはヴァルハラ計画中に開発された新しいタイプがあります。レコードは列挙に似ており、コードを簡素化できます。基本的に、これらは状態はあるが動作を持たないクラスを置き換えます。簡単に言えば、フィールドはありますが、メソッドはありません。クラスの場合、コンストラクター、アクセサー、equals()、hashCode()、toString()など、必ずしも必要ではない多くの繰り返しコードを記述する必要がある場合があります。この繰り返しコードを回避するために、Java は計画しています。レコードを使用します。クラシックバージョンは次のとおりです。
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Java 14 に移行して、レコードを使用してみましょう。
public record Triangle(int x, int y, int z){}
それだけです。現在、記録はプレビュー形式で存在するため、実際に試してみるには、jdk14 をダウンロードして次のコマンドを入力する必要があることに注意してください。
javac —enable-preview —release 14 Triangle.java
制限はありますが、レコードはクラスです。他のクラスを拡張したり、フィールドを宣言したりすることはできません (状態宣言コンポーネントに対応する private Final を除く)。レコードは暗黙的に最終的なものであり、抽象化することはできません。レコードは、API をその表現から分離できないという点で通常のクラスとは異なります。しかし、自由度の喪失は精度の向上によって補われます。レコード コンポーネントも暗黙的に最終的なものになります。

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

Java 14 のプレビューで導入されたパターン マッチング機能は、オブジェクトの型のチェックと、instanceof演算子でのその変換を組み合わせるように設計されています。言い換えれば、Java 14 より前には、たとえば次のようなコードがありました。
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
ご覧のとおり、メソッドを使用したいクラスにオブジェクトをキャストする必要があります。Java 14 と接続されたパターン マッチング機能により、コードを次のように減らすことができます。
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: パッケージングツール (インキュベーター)

JDK 8 には、 JavaFX 用に設計されたjavapackagerツールがありました。ただし、JDK 11 のリリースにより JavaFX が Java から分離された後、人気のある javapackager は利用できなくなりました。 Javapackager はパッケージ化ツールでした。これにより、Java アプリケーションを他のすべての「通常の」プログラムと同じようにインストールできる方法でパッケージ化できるようになりました。たとえば、Windows ユーザー向けに exe ファイルを作成し、人間と同じようにダブルクリックで Java アプリケーションを起動します。もちろん、そのようなツールは非常に不足しているため、JEP 343 では、必要な依存関係をすべて含むプラットフォーム固有のパッケージに Java アプリケーションをパッケージ化する新しいツールjpackageが導入されました。特定のプラットフォームでサポートされているパッケージ形式:
  • Linux: deb と rpm
  • macOS: pkg と dmg
  • Windows: MSI および EXE

JEP 345: G1 の NUMA 対応メモリ割り当て

JEP 345 は、NUMA (Non-Uniform Memory Access) サポートの実装のみを目的としています。これらは異種メモリ アクセス アーキテクチャであり、メモリをローカルに分散できるマルチプロセッサ システムにマイクロプロセッサ クラスタをセットアップする方法です。各プロセッサ コアは少量のローカル メモリを取得し、他のコアはそれにアクセスします。JEP 345 は、G1 ガベージ コレクターにそのようなアーキテクチャを活用する機能を装備することを計画しています。とりわけ、このアプローチは、非常に強力なマシンのパフォーマンスの向上に役立ちます。

JEP 349: JFR イベントストリーミング

Java Flight Recorder (JFR) はOpenJDK の一部となっているため、無料で利用できます。JDK 14 では、JFR イベント (JDK Flight Recorder) をオンザフライで追跡するための API、特にアクティブなアプリケーションと非アクティブなアプリケーションの継続的な監視を組織化するための API が追加されています。非ストリーミング オプションの場合と同じイベントが記録されますが、オーバーヘッドは 1% 未満です。この方法では、イベントは非ストリーミング オプションと同時にストリーミングされます。ただし、JEP 349 では、対応するコンシューマの同期コールバックを許可してはなりません。中間メモリに格納されているレコードのデータであってもアクセスできないようにする必要があります。技術的には、jdk.jfr モジュール内の jdk.jfr.consumer パッケージは、イベントへの非同期アクセスのための機能で拡張されます。

JEP 352: 不揮発性のマップされたバイト バッファー

ご存知のとおり、Java NIO (New IO) ファイル API はJDK 1.4 から存在しており、その後、Path と呼ばれる新しい拡張機能が導入されました。Path は、Java NIO で作業するときにファイルまたはディレクトリの表現として java.io.File クラスを置き換えるインターフェイスです。JEP 352 は、MappedByteBuffer を拡張して、ファイル データの一部を不揮発性メモリ (NVM) にロードします。このコンピュータのメモリは、電源を切ってもデータが失われないもの (読み取り専用メモリとも呼ばれます) で、データを永続的に保存するために使用されます。この Java 拡張提案は、JDK API の新しいモジュールとクラス、jdk.nio.mapmode モジュールを提供します。これは、NVM を参照するマップされたバイト バッファー (MappedByteBuffer) を作成するための新しいモード (READ_ONLY_SYNC、WRITE_ONLY_SYNC) を提供します。

JEP 358: 役立つ NullPointerExceptions

NullPointerExceptionsがよりプログラマにとって使いやすくなりました。例外の説明が以前よりもはるかに有益になるという意味で。これは、JVM がプログラムのバイトコード命令をより正確に分析するように教えられており、どの変数がゼロ値につながるかを示すことができるためです。次のコードがあるとします。
a.getMessage().getUserInfo().getName()
最新の Java では、通常のエラー ログが取得されますが、正確に誰が null なのかという質問には答えられません。
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
このプレビュー機能を試してみることにした場合、Java 14 で得られるものは次のとおりです。
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
このチェーンははるかに理解しやすく、より迅速にエラーに対処できるようになります。

JEP 361: スイッチ式 (標準)

更新された Switch オペレーターは以前の Java 12 および 13 で利用できましたが、プレビュー機能としてのみ利用可能でした。つまり、デフォルトでは有効になっていませんでした。JDK 14 では、何も設定しなくてもすべてが機能するようになりました。Java 14 では、case L -> ... ラベルを使用した switch ブロックの新しい簡略化された形式が導入され、場合によってはコードが簡素化されます。以下にいくつかの例を示します。曜日を表す列挙型があるとします。従来のコード (Java 14 以前) を作成できます。
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Java 14 を使用するオプションは次のとおりです。
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
複数行のブロックを記述し、新しい yield キーワードを使用して値を返すこともできます。
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
新しいスイッチを 使用する際には、留意すべき重要な点がいくつかあります。特に、オプションは網羅的である必要があることに留意する必要があります。つまり、すべての可能な値に対して、対応するスイッチ ラベルが存在する必要があります。yieldがキーワードになったため、Java 14 では yield というクラスが可能になります。一般に、更新されたスイッチの使用方法を学びたい場合は、JEP 361にアクセスして勉強してください。そこには興味深い情報がたくさんあります。

JEP 362: Solaris ポートと SPARC ポートの非推奨化

Solarisオペレーティング システムについて覚えている読者はほとんどいないでしょう。Java の親である Sun Microsystems によって作成されたこの UNIX ベースのオペレーティング システムは、主に SPARC アーキテクチャ上のサーバーに使用されていました...1 平方センチメートルあたりに聞き慣れない単語が多すぎますか? 大したことはありません。JEP 362 は、Solaris/SPARC、Solaris/x64、および Linux/SPARC プラットフォームのサポートを終了します。つまり、それらのポートは現在非推奨となっており、将来的には OpenJDK から削除される可能性が高くなります。ただし、Solaris/SPARC、Solaris/x64、および Linux/SPARC ポートに関する古いバージョンの Java (JDK 14 より前) は、変更せずに動作するはずです。あなたが歴史愛好家で、それほど遠くない過去のテクノロジーに興味がある場合は、Wikipedia にアクセスしてSPARСアーキテクチャについて読んでください。

JEP 363: コンカレント マーク スイープ (CMS) ガベージ コレクターの削除

CMS ガベージ コレクター (同時マーク スイープ) は、2 年前に古いものとしてマークされ、メンテナンスされていないため、削除の対象となっています。ただし、CMS GC を使用している古いバージョンの Java のユーザーは吐き出すことができます。この JEP の目的は、以前の JDK リリースからビルダーを削除することではありません。さらに、ParallelScavenge と SerialOld ガベージ コレクション アルゴリズムの組み合わせ (「-XX:+UseParallelGC -XX:-UseParallelOldGC」オプションで実行) は非推奨になりました。

JEP 364: macOS 上の ZGCおよびJEP 365: Windows 上の ZGC

Z Garbage Collector (ZGC)と呼ばれる興味深いガベージ コレクターがあります。これはパッシブ モードで動作し、ガベージ コレクションによる遅延を最小限に抑えようとします。ZGC 使用時の停止時間は 10 ミリ秒を超えません。小さなヒープと巨大なヒープ (数テラバイトを占めるヒープ) を扱うことができます。JEP 364 と JEP 365 は実質的に双子です。JEP 364 は、Z ガベージ コレクターを MacOS に導入します。JEP の一部では、JEP 351で指定されているように、未使用のデバイス メモリを解放するためのコレクタ機能についても説明されています。これは Java 13 以降に行われています。macOS での ZGC 実装には 2 つの部分があります。
  • macOS でのマルチマッピング メモリのサポート
  • ZGC による連続メモリ予約のサポート
JEP 365 は、Windows 上ですでに ZGC をサポートしており、実験モードでもサポートしています。それは次のとおりです。
  • マルチマッピングメモリのサポート
  • ページ ファイルに基づいて予約されたアドレス空間へのメモリ マッピングのサポート
  • ヒープの任意の部分のマッピングとマッピング解除のサポート
  • ヒープの任意の部分のコミットおよびコミット解除のサポート

JEP 366: ParallelScavenge + SerialOld GC の組み合わせを非推奨にする

この JEP は、Parallel Scavenge アルゴリズムと Serial Old ガベージ コレクション アルゴリズムの組み合わせを非推奨とします。この組み合わせは、コマンド ライン パラメーター -XX: + UseParallelGC -XX: -UseParallelOldGC を使用して手動で有効にする必要がありました。著者らは、この組み合わせは非常に特殊ですが、多大なメンテナンス作業も必要になると考えています。そのため、-XX: UseParallelOldGC オプションは非推奨となり、使用すると警告が表示されます。

JEP 367: Pack200 ツールと API を削除する

Pack200 は、コンパイルされた Java クラス ファイルを保存するために最適化されたアーカイブ形式です。このツールは Java 11 以降非推奨としてマークされています。現在、pack200、unpack200、および Pack200 API ツールがjava.util.jar パッケージから削除されることが正式に発表されました。このテクノロジーは、非常に限られた帯域幅 (モデム、言うのと思い出すのは恐ろしいことですが、56k) とハードドライブ上の不十分なストレージ容量に対処する手段として Java 5 に導入されました。少し前に、Java 9 に新しい圧縮スキームが導入されました。開発者はjlink を使用することをお勧めします。

JEP 368: テキスト ブロック (2 番目のプレビュー)

テキスト ブロックはJava 13 で初めて登場しました。テキスト ブロックは複数行の文字列リテラルで、ほとんどのエスケープ シーケンスが不要になり、文字列が自動的にフォーマットされ、必要に応じて開発者が文字列をフォーマットできるようになります。この便利な機能は Java 14 (2nd Preview) で利用できるようになりました。テキスト ブロックの主な目的は、紛らわしい複数行リテラルの処理を改善することです。これにより、SQL クエリ、HTML および XML コード、JSON の読み取りと書き込みが大幅に簡素化されます。テキストブロックを含まない HTML の例:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
同じことをテキスト ブロックで表現する方法:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
開始区切り文字は、3 つの二重引用符 ("" ") のシーケンスで、その後に 0 個以上のスペース、そして行区切り文字が続きます。コンテンツは、開始区切り文字の行区切り文字の後の最初の文字から始まります。終了 区切り文字は次のとおりです。一連の 3 つの二重引用符文字 " _) が選択されているのは、文字をエスケープせずに表示でき、テキスト ブロックと文字列リテラルを視覚的に区別できるようにするためです。2019 年の初めに、JEP 355 は JEP 326 (Raw String リテラル) の継続としてテキスト ブロックを提案しましたが、それらは撤回されました。その年の後半、JDK 13 ではテキスト ブロック プレビュー機能が導入され、Java 14 では 2 つの新しいエスケープ シーケンスが追加されました。これは \ で示される行終端文字であり、2 番目は /s で示される単一スペースを表します。テキストブロックなしで改行を使用する例:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
そしてエスケープ シーケンス \<line-terminator> を使用します。
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
エスケープ シーケンス\s は、末尾の空白を考慮するために使用されますが、デフォルトではコンパイラによって無視されます。その前にある空白はすべて保持されます。例:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1text2同一です。

JEP 370: 外部メモリ アクセス API (インキュベーター)

一般的な Java ライブラリおよびプログラムの多くは、外部メモリにアクセスできます。たとえば、Ignite、MapDB、Memcached、Netty ByteBuf API などです。そうすることで、ガベージ コレクションに関連するコストと予測不可能性 (特に大規模なキャッシュを処理する場合) を回避し、複数のプロセス間でメモリを共有し、メモリ内のファイルをマッピングする (たとえば、mmap を使用する) ことによってメモリ内容をシリアル化および逆シリアル化できます。ただし、Java API には、外部メモリにアクセスするための適切なソリューションがまだありません。JDK 14には、Foreign-Memory Access APIのプレビューが含まれています。これにより、Java アプリケーションは、新しい MemorySegment、MemoryAddress、および MemoryLayout 抽象化を使用して、JVM ヒープの外側のメモリ領域に安全かつ効率的にアクセスできるようになります。

結論

それで、あなたはどう思いますか?Java 13 と比較して、新しい Java 14 では、さまざまな分野でさらに多くの重要な改善が行われています。おそらく、開発者にとって最も重要なのは、更新されたスイッチ、拡張例外 NullPointerExceptions およびレコードでしょう。そうでないでしょうか?. Java 14 の新機能は初心者にとっても非常に便利なので、ぜひ試してみてください。勉強頑張ってください!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION