きっかけ
そろそろリリースだなと思い、リリース前に予習したくなったから
事前学習
リリース内容
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
JEP 325: Switch Expressions (Preview)
JEP 340: One AArch64 Port, Not Two
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
# 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インポート使ったなって思った。