JDK 11の重要なポイントを勉強してきた

ちょうど今週は東京に出張で来てたのでJJUGナイトセミナーに参加してきたー。面白かった!

jjug.doorkeeper.jp

Java is Still Free

会場に着いたらJava is Still Freeの日本語版がスクリーンに映ってた。じゅくちょーすごいなぁ。

by 伊藤 敬さん

JDK 11リリースなので改めて「新しいJDKリリースモデル解説(サマリー&アップデート)」 by 伊藤 敬さん

公式情報のおさらい!

by 久保田 祐史さん

Java 11 : サポートとVM機能 編 by 久保田 祐史さん

分かりやすかったー。

by きしだなおきさん

Java 11:APIの変更点 編 by きしだなおきさん

JEPの話と、JEP以外の変更の話とで面白かったー。会場到着が間に合ってよかったね。

Stringの+=に副作用があるバグ

のお話をきしださんがしてて面白そうだったので試してみた。

❯ docker run --rm -ti openjdk:10.0.1-jdk jshell
Oct 09, 2018 3:10:52 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 10.0.1
|  For an introduction type: /help intro

jshell> var s = new String[]{"1", "2", "3"};
s ==> String[3] { "1", "2", "3" }

jshell> var i = 0;
i ==> 0

jshell> s[i++] += "a";
$3 ==> "2a"

jshell> i
i ==> 2

jshell> s
s ==> String[3] { "2a", "2", "3" }

おー!i1じゃなくて2になってるし、1aじゃなくて2aになってる!バグってる!

詳しくはこちら:

Java9、10でStringの+=に副作用があるバグ - きしだのはてな

2019-05-01以降でHEISEIが使えない問題

これも面白いなーと思った。こういうファイルを作って・・・

import java.time.chrono.JapaneseDate;
import java.time.chrono.JapaneseEra;

public class Hello {
  public static void main(String[] args) {
    System.out.println(JapaneseDate.of(JapaneseEra.HEISEI, 31, 4, 30));
    System.out.println(JapaneseDate.of(JapaneseEra.HEISEI, 31, 5, 1));
  }
}

8u181で実行するとなんともないんだけど

❯ docker run --rm -ti -v $(pwd)/Hello.java:/Hello.java openjdk:8u181-jdk sh -c 'javac Hello.java; java Hello'
Japanese Heisei 31-04-30
Japanese Heisei 31-05-01

11で実行すると・・・

❯ docker run --rm -ti -v $(pwd)/Hello.java:/Hello.java openjdk:11-jdk sh -c 'javac Hello.java; java Hello'
Japanese Heisei 31-04-30
Exception in thread "main" java.time.DateTimeException: year, month, and day not valid for Era
        at java.base/java.time.chrono.JapaneseDate.of(JapaneseDate.java:231)
        at Hello.main(Hello.java:7)

もうその日は平成じゃないよ!って怒られる。元号を使ってる場合は、頭の片隅に入れておいたほうが良さそうかな。

詳しくはこちら:

Javaの新元号対応を試す。そして実用には問題がある - きしだのはてな

来てよかった

色んな人に会えて嬉しかったなー。