きっかけ
そろそろリリースだなと思い、リリース前に予習したくなったから
事前学習
リリース内容
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
JEP 230: Microbenchmark Suite
JEP 325: Switch Expressions (Preview)
JEP 334: JVM Constants API
JEP 340: One AArch64 Port, Not Two
JEP 341: Default CDS Archives
JEP 344: Abortable Mixed Collections for G1
JEP 346: Promptly Return Unused Committed Memory from G1
リリース内容の要約
google翻訳かけてサマっただけですが。。。
- JEP 189
ShenandoahというGCアルゴリズムを追加。Java実行中にコンパクションを実行するらしい。Javaが停止する時間がスキャンのみになって、ヒープが増えても一時停止時間が同じというのがメリット。
- JEP 230
マイクロベンチマークツールをJDKに入れるよ
- JEP 325
switch文のcaseに、ラムダ式かけるようになったよ
- JEP 334
知識不足過ぎて、何なのかよく分からんかったった。。。
- JEP 340
ARM64bit用のPortがarm64/aarch64とあったので、arm64を削除してaarch64に統一するよ
- JEP 341
知識不足過ぎて、何なのかよく分からんかったった。。。
- JEP 344
G1のmixedの一時停止が長期間になる場合、中止を可能にする
- JEP 346
Javaのヒープ使用量を鑑みて、必要に応じて未使用のヒープ領域をOSに返すよ
開発者として影響がありそうなのは、JEP 325かな?
switch文死ねマンからすると、あまり気にならないが。。。
実験
環境
Docker使って試しました。
Kitematic使って、Java12環境を構築した。手っ取り早くやれるので、かなり便利
Docker
docker version
Client:
Version: 18.03.0-ce
API version: 1.37
Go version: go1.9.4
Git commit: 0520e24302
Built: Fri Mar 23 08:31:36 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
つかったコンテナは、alpine-java12
ってやつ。
https://hub.docker.com/r/pwittchen/alpine-java12
# java -version
openjdk version "12-ea" 2019-03-19
OpenJDK Runtime Environment (build 12-ea+29)
OpenJDK 64-Bit Server VM (build 12-ea+29, mixed mode, sharing)
JEP 325: Switch Expressions を試す。
とりあえず、公式にあるやつをパクって試す。
import java.util.Calendar;
import static java.util.Calendar.*;
public class JEP325 {
public static void main(String[] args) {
int day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
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);
}
}
}
曜日の定数を作るのが面倒だったので、Calendarクラスをstaticインポートした。
実行は、下記の手順で実施
$ java --enable-preview --release 12 JEP325.java
$ java --enable-preview JEP325
6
実行したのが、日曜なので、ちゃんと動いているっぽい。
肝は、break要らないってところだな。
breakで泣かされたことがある身としては、進歩したなとは感じるが、やっぱり、利用する気にはなれない。
JEP 325: Switch Expressions を試す。(値を返す)
公式サイトを読み進めると、「値も返せるぜ!」的なサンプルあったので、ついでに試す。
import java.util.Calendar;
import static java.util.Calendar.*;
public class JEP325_2 {
public static void main(String[] args) {
Integer day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
break result;
}
};
System.out.println("switch result. j:" + j);
}
private static int f(int k) {
return k + 100;
}
}
$ java --enable-preview --release 12 JEP325_2.java
$ java --enable-preview JEP325_2
switch result. j:101
普通に動作する。
当然の動き。
考察
Java12のリリースでは、特に注目している機能はないが、リリースは予定通り行われそう。
直近のリリースで、switch文の改修がかなり入ってくるのは、switch文に熱心な人がコミッターにいるのかな?
switch文押しが強いことに驚く。
GC周りの知識不足が否めない。。。
どうやって学習したら良いのだろうか?
試してみて、Docker&Kitematecが便利だったってのが印象に残りました。
あと、久しぶりにstaticインポート使ったなって思った。
参考リンク
JDK 12
Java12新機能まとめ - Qiita