エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Java12リリース前の予習

きっかけ

そろそろリリースだなと思い、リリース前に予習したくなったから

事前学習

リリース内容

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

# 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