Java 12 の特徴
ついに、6ヶ月のリリースサイクルの一環として、JDK 12が登場しました。これは、前回のJava LTSバージョンであるバージョン11の後にリリースされたものです。以前に、私たちはJava 11の機能について詳しく話し合いました。今日は、Java 12の機能について議論し、開発者にどのような要素を提供しているのかを見ていきます。Java 12は2019年3月19日にリリースされました。これは、Non-LTSバージョンです。したがって、長期的なサポートは受けられないでしょう。
Java 12 の新機能
Java 12の重要な特徴の一部は、
-
- JVMの変更 – JEP 189、JEP 346、JEP 344、およびJEP 230。
-
- スイッチ式
-
- ファイルのmismatch()メソッド
-
- コンパクトな数値の書式設定
-
- ストリームAPIでのTeeing Collectors
-
- Javaの新しい文字列メソッド – indent()、transform()、describeConstable()、およびresolveConstantDesc()。
-
- JEP 334:JVM Constants API
-
- JEP 305:instanceofのパターンマッチング
- JDK 12からRaw String Literalsが削除されました。
一つずつ、これらのJava 12の機能を調べてみましょう。
JVM の変更
1. JEP 189 – シェナンドア:低遅延のガベージコレクター(実験的)
RedHatは、GCの一時停止時間を短縮するためにShenandoahガベージコレクターを導入しました。このアイデアは、実行中の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
ネイティブな日本語で以下を言い換えると、以下のようになります:
JDKソースコードに基本的なマイクロベンチマークスイートを追加するJEP 230の機能により、既存のマイクロベンチマークを実行したり新しいものを作成したりすることが開発者にとって容易になりました。JEP 344の一つのAArch64ポートは、32ビットARMポートと64ビットaarch64ポートを維持しながら、arm64ポートに関連するすべてのソースを削除します。これにより、貢献者は一つの64ビットARM実装に集中することができます。
5. JEP 341 デフォルトのCDSアーカイブ
この機能は、64ビットのプラットフォーム上でデフォルトのクラスリストを使用してクラスデータ共有(CDS)アーカイブを生成するためのJDKビルドプロセスを強化しています。目標は、起動時間を改善することです。Java 12から、CDSはデフォルトでONになっています。CDSをオフにしてプログラムを実行するには、次の手順を実行してください。
java -Xshare:off HelloWorld.java
今、プログラムの起動時間が遅くなります。
言語の変化と特徴
Java 12では、多くの言語の特徴が導入されました。それらをいくつか実装してみましょう。
1. スイッチ式(プレビュー版)
Java 12では、パターンマッチングのためにSwitch式が強化されています。JEP 325で導入された新しい構文は、プレビュー言語機能としての役割を果たしています。以下に、Switch式に関するいくつかのポイントをご紹介します。
- The new Syntax removes the need for break statement to prevent fallthroughs.
- Switch Expressions don’t fall through anymore.
- Furthermore, we can define multiple constants in the same label.
- default case is now compulsory in Switch Expressions.
- break is used in Switch Expressions to return values from a case itself.
クラシックなスイッチ文:
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);
新しいSwitch式を使用することで、ブレイクをどこにでも設定する必要がなくなり、その結果、論理エラーを防ぐことができます!
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リリースで確認されるとは限りません。
2. File.mismatch メソッド
Java 12では、二つのファイルを比較するための以下のメソッドが追加されました。
public static long mismatch(Path path, Path path2) throws IOException
このメソッドは、最初の不一致の位置を返します。もし不一致がない場合は-1Lを返します。2つのファイルには、以下のシナリオで不一致が発生する可能性があります。
- If the bytes are not identical. In this case, the position of the first mismatching byte is returned.
- File sizes are not identical. In this case, the size of the smaller file is returned.
以下に、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プログラムをコンパイルして実行した場合の出力は次の通りです。
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");
}
}
4. ティーを集める人々 (Tī o atsumeru hitobito)
Teeing Collectorは、Streams APIで導入された新しいコレクターユーティリティです。このコレクターは3つの引数を持ちます−2つのコレクターと1つのバイファンクションです。すべての入力値が各コレクターに渡され、その結果がバイファンクションで利用できます。
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メソッドのチュートリアルを参照してください。
6. JEP 334: JVM Constants API
6. JEP 334:JVM定数API
このJEPでは、新しいパッケージjava.lang.constantが導入されます。これは、定数プールを使用しない開発者にはあまり役に立ちません。
7. JEP 305: instanceofに対するパターンマッチング(プレビュー)
もう一つのプレビュー言語の機能!型を別の型に変換する従来の方法は次のとおりです:
if (obj instanceof String) {
String s = (String) obj;
// use s in your code from here
}
新しい方法は次のとおりです:
if (obj instanceof String s) {
// can use s directly here
}
これによって、不必要なタイプキャストが省けます。 (Kore ni yotte, fuyōna taipu kyasuto ga habukemasu.)
JDK 12から、生の文字列リテラルは削除されました。
この記事では、Java 12の特徴について紹介しました。