Java 12の機能

ついに、6ヶ月ごとのリリースサイクルの一環として、JDK 12がここにあります。これは、前回のJava LTSバージョン11の後にリリースされました。以前、Java 11の機能について詳しく話し合いました。今日はJava 12の機能について議論し、開発者にどのようなものがあるかを見ていきます。Java 12は2019年3月19日に発売されました。これは非LTSバージョンです。したがって、長期サポートはありません。

Java 12の機能

いくつかの重要なJava 12の機能は次のとおりです:

  1. JVMの変更 – JEP 189、JEP 346、JEP 344、およびJEP 230。
  2. スイッチ式
  3. ファイルのmismatch()メソッド
  4. コンパクトな数値の書式設定
  5. Stream APIのTeeing Collectors
  6. Java Stringsの新しいメソッド – indent()、transform()、describeConstable()、およびresolveConstantDesc()。
  7. JEP 334:JVM Constants API
  8. JEP 305:instanceofのパターンマッチング
  9. JDK 12からRaw String Literalsが削除されました。

これらすべてのJava 12の機能を1つずつ見ていきましょう。

JVMの変更

1. JEP 189 – Shenandoah: 低遅延時間ガベージコレクター(実験的)

RedHatはShenandoahガベージコレクターを開発し、GCの一時停止時間を短縮することを目指しています。アイデアは、実行中のJavaスレッドと同時にGCを実行することです。ヒープサイズに関係なく、一貫性のある予測可能な短い一時停止を目指します。ヒープサイズが15MBでも15GBでも問題ありません。これはJava 12の実験的な機能です。

2. JEP 346 – G1から未使用の確保済みメモリを迅速に返す

Java 12から、G1はアプリケーションの非アクティブ時にJavaヒープメモリをチェックし、それをオペレーティングシステムに返します。これは、空きメモリを節約して利用するための予防措置です。

3. JEP 344: G1向けの中断可能なミックスコレクション

G1の効率改善には、指定された一時停止目標を超える可能性がある場合に、G1のミックスコレクションを中断可能にするというものがあります。これは、ミックスコレクションセットを必須とオプションに分割することによって行われます。したがって、G1コレクタは一時停止時間の目標を満たすために、まず必須のセットを収集することを優先することができます。

4. JEP 230および344

マイクロベンチマークスイート、JEP 230の機能は、JDKソースコードに基本的なマイクロベンチマークスイートを追加します。これにより、開発者は既存のマイクロベンチマークを実行したり、新しいベンチマークを作成したりすることが容易になります。JEP 344では、AArch64ポートを2つではなく1つに絞り、arm64ポートに関連するソースをすべて削除します。ただし、32ビットARMポートと64ビットaarch64ポートは保持されます。これにより、貢献者は1つの64ビットARM実装に力を集中させることができます。

5. JEP 341デフォルトのCDSアーカイブ

これにより、JDKのビルドプロセスが64ビットプラットフォームでデフォルトのクラスリストを使用してクラスデータ共有(CDS)アーカイブを生成するようになります。目標は起動時間の改善です。Java 12以降、CDSはデフォルトでONになっています。CDSを無効にしてプログラムを実行するには、以下の手順を実行してください:

java -Xshare:off HelloWorld.java

これにより、プログラムの起動時間が遅くなります。

言語の変更と機能

Java 12では多くの言語機能が導入されています。いくつかの実装を見てみましょう。

1. スイッチ式(プレビュー)

Java 12では、パターンマッチングのためにスイッチ式が強化されました。新しい構文はL ->です。スイッチ式についてのいくつかの注意点は以下の通りです。

  • 新しい構文では、フォールスルーを防ぐためにbreak文を記述する必要がありません。
  • スイッチ式ではもはやフォールスルーしなくなりました。
  • さらに、同じラベルで複数の定数を定義することができます。
  • defaultケースはスイッチ式で必須となりました。
  • スイッチ式ではbreakを使用してケース自体から値を返します。

従来のスイッチ文:

String result = "";
        switch (day) {
            case "M":
            case "W":
            case "F": {
                result = "MWF";
                break;
            }
            case "T":
            case "TH":
            case "S": {
                result = "TTS";
                break;
            }
        };

        System.out.println("Old Switch Result:");
        System.out.println(result);

新しいスイッチ式では、どこにでもbreakを設定する必要がなくなり、ロジックエラーを防げます!

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);

以下のJDK 12を使用した新しいスイッチ式を含むプログラムを実行しましょう。

public class SwitchExpressions {

    public static void main(String[] args)
    {
        System.out.println("New Switch Expression result:");
        executeNewSwitchExpression("M");
        executeNewSwitchExpression("TH");
        executeNewSwitchExpression("");
        executeNewSwitchExpression("SUN");
    }

    public static void executeNewSwitchExpression(String day){

        String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);
    }
}

この機能はプレビュー機能ですので、Java 12 プレビューとして言語レベルを選択してください。上記のコードをコンパイルするには、次のコマンドを実行してください:

javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java

コンパイルされたプログラムを実行すると、コンソールに以下の結果が表示されます:

Java Switch Expressions Program Output

スイッチ式はプレビューの言語機能です。これは、完全であるにも関わらず、将来のJavaリリースで確定されない可能性があります。

2. File.mismatch メソッド

Java 12 では、次のメソッドがファイルの比較に追加されました:

public static long mismatch(Path path, Path path2) throws IOException

このメソッドは、最初の不一致の位置を返すか、不一致がない場合は -1L を返します。2つのファイルには、次のシナリオで不一致が発生する可能性があります:

  • バイトが同一ではない場合。この場合、最初の不一致するバイトの位置が返されます。
  • ファイルのサイズが同一ではない場合。この場合、より小さいファイルのサイズが返されます。

IntelliJ IDEA のコードスニペットの例を以下に示します:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileMismatchExample {

    public static void main(String[] args) throws IOException {
        Path filePath1 = Files.createTempFile("file1", ".txt");
        Path filePath2 = Files.createTempFile("file2", ".txt");
        Files.writeString(filePath1,"JournalDev Test String");
        Files.writeString(filePath2,"JournalDev Test String");

        long mismatch = Files.mismatch(filePath1, filePath2);

        System.out.println("File Mismatch position... It returns -1 if there is no mismatch");

        System.out.println("Mismatch position in file1 and file2 is >>>>");
        System.out.println(mismatch);

        filePath1.toFile().deleteOnExit();
        filePath2.toFile().deleteOnExit();

        System.out.println();

        Path filePath3 = Files.createTempFile("file3", ".txt");
        Path filePath4 = Files.createTempFile("file4", ".txt");
        Files.writeString(filePath3,"JournalDev Test String");
        Files.writeString(filePath4,"JournalDev.com Test String");

        long mismatch2 = Files.mismatch(filePath3, filePath4);

        System.out.println("Mismatch position in file3 and file4 is >>>>");
        System.out.println(mismatch2);

        filePath3.toFile().deleteOnExit();
        filePath4.toFile().deleteOnExit();



    }

}

上記のJavaプログラムをコンパイルして実行した場合の出力は次のとおりです:

Java File Mismatch Example Program Output

3. コンパクトな数値の書式設定

import java.text.NumberFormat;
import java.util.Locale;

public class CompactNumberFormatting {


    public static void main(String[] args)
    {
        System.out.println("Compact Formatting is:");
        NumberFormat upvotes = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
        upvotes.setMaximumFractionDigits(1);

        System.out.println(upvotes.format(2592) + " upvotes");


        NumberFormat upvotes2 = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
        upvotes2.setMaximumFractionDigits(2);
        System.out.println(upvotes2.format(2011) + " upvotes");
    }


}
Java Compact Number Formatting Program Output

4. ティーイングコレクター

ティーイングコレクターは、Streams APIで導入された新しいコレクターユーティリティです。このコレクターには3つの引数があります-2つのコレクターとバイファンクション。すべての入力値が各コレクターに渡され、結果はバイファンクションで利用できます。

double mean = Stream.of(1, 2, 3, 4, 5)
                .collect(Collectors.teeing(
                        summingDouble(i -> i),
                        counting(),
                        (sum, n) -> sum / n));

System.out.println(mean);

出力は3.0です。

5. Javaの新しい文字列メソッド

Java 12で導入された4つの新しいメソッドは次のとおりです:

  • indent(int n)
  • transform(Function f)
  • Optional describeConstable()
  • String resolveConstantDesc​(MethodHandles.Lookup lookup)

上記のメソッドとその詳細な実装については、当社のJava 12 String Methodsチュートリアルを参照してください。

6. JEP 334: JVM Constants API

A new package java.lang.constant is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.

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

もう一つのプレビューランゲージ機能です!型を別の型にキャストする従来の方法は次のようになります:

if (obj instanceof String) {
    String s = (String) obj;
    // ここからコードのsを使用する
}

新しい方法は次のようになります:

if (obj instanceof String s) {
    // ここで直接sを使用できる
} 

これにより、不要な型キャストを省略できます。

Raw String LiteralsはJDK 12から削除されました。

これでJava 12の機能に関する記事は終わりです。

Source:
https://www.digitalocean.com/community/tutorials/java-12-features