Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テックポエム 祝! JDK14 リリース

koduki
March 21, 2020
230

テックポエム 祝! JDK14 リリース

koduki

March 21, 2020
Tweet

Transcript

  1. TL;DR  JDK14が無事にリリース。LTSの17に向けての下準備多数  RecordやPattern Matching、Text Blocks がプレビューながら追加  JFR

    Stream API, Switch式など新APIや構文も追加  ZGCのWin/Macサポート、CMSの廃止などGC周りの改修もあり  詳しくはきしださんのJava 14新機能まとめ参照  https://qiita.com/nowokay/items/ec85d97a7cecaaac8123  一応言っておくけど、今もJavaは無料で使えます
  2. JEP359: Record型(previw)が登場!  Scalaのcase class, KotlinのData Classesみたいなの  Immutableなデータ型 

    Java Beansの冗長な書き方からついに解放  たぶんJavaが批判される筆頭的な部分だった  Lombok, IDEで生成, public field使う, 心を無にするなど 様々な対策  ただし、previewなのですぐプロダクションで使える わけではない。コンパイラと実行に--enable-preview を付ける必要がある
  3. Java Bean public class Person { private String name; private

    int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person[" + "name=" + name + ", age=" + age + ']'; } @Override public int hashCode() { int hash = 7; hash = 47 * hash + Objects.hashCode(this.name); hash = 47 * hash + this.age; return hash; } @Override public boolean equals(Object obj) {….} }
  4. Record型の特徴  超短い!  コンストラクタの拡張等は出来る  TupleのようにLambdaの戻り値として使い捨ての生成は出 来ない  IImmutableな型しか作れず、アクセッサもgetXXではなく

    xx()なので単純なJava Beanの置き換えではない  Int定数に対するenum型のように用途を明確にした型だと いう理解が良いかも  JavaBeanと互換性はないので、JPAとかJAX-RSとかの対応 はこれからと思われる
  5. 368: Text Blocks (Second Preview)  “”“で括ることで複数行書ける。  インデントは一番浅いところが基準でそれ以降はスペース 

    変数埋め込みはformattedメソッドで行う var str = """ こんにちは、%sさん。 今日も Happy Hacking! """.formatted("紅月"); str ==> “こんにちは、紅月さん。¥n 今日も¥nHappy Hacking!¥n"
  6. JEP305: Pattern Matching(Preview)  端的に言えば型判定と同時に代入が出来る構文。関数型言語では 便利に活用  If文だと正直嬉しさが少ないのでswitchに対応したJEP 375に期待 

    入れ子のレコードとか解析できるようになると捗る if (obj instanceof String s) { // can use s here } else { // can't use s here } if (!(obj instanceof String s)) { .. s.contains(..) .. } else { .. s.contains(..) .. }
  7. JEP361: Switch Expressions (Standard)  12, 13でプレビューとして入っていたSwitch式が正式に。  breakが不要だったり、同値を固めたり出来てシンプルな構文に 

    戻り値はyieldだが省略は可能  なぜかNetBeans11.3で動かす場合はNetBeans自体をJDK14で動か さないとシンタックスエラーになるので注意 #そうしないと14の コンパイラ機能が使えない模様
  8. JEP361: Switch Expressions (Standard) int fib(int n) { int r;

    switch (n) { case 1: case 2: r = 1; break; default: r = fib(n - 1) + fib(n - 2); break; } return r; } int fib(int n) { return switch (n) { case 1, 2 -> 1; default -> fib(n - 1) + fib(n - 2); }; }
  9. JEP349: JFR Event Streaming  JDK Flight Recorderがファイルだけではなく、ストリームイベント として実行できるように。 

    基本的には問題発生してPGが落ちたときのBlackBox分析に有用 だったJFRがモニタリングにも活用できるように  カスタムイベントも問題なく利用可能。  ログに吐いたり、Kafka等に直で投げたり、MP Profileと連携が主な 利用イメージ。
  10. JEP349: JFR Event Streaming public static void main(String[] args) throws

    IOException { CompletableFuture.runAsync(() -> { while (true) { try { var event = new SampleCustomEvent2(); event.begin(); event.myproperty = "Hello, " + System.currentTimeMillis(); event.commit(); Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(ExampleStreamJFR.class.getName()).log(Level.SEVERE, null, ex); } } }); try (var rs = new RecordingStream()) { rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1)); rs.onEvent("jdk.CPULoad", System.out::println); rs.onEvent(SampleCustomEvent2.class.getName(), (event) -> { System.err.println("my event:" + event.getString("myproperty")); }); rs.start(); } }
  11. JEP349: JFR Event Streaming @Category({"Application Profile"}) @Label("Sample") public static class

    SampleCustomEvent2 extends Event { @Label("Sample Property") String myproperty; } my event:Hello, 1584846088763 jdk.CPULoad { startTime = 19:01:29.680 jvmUser = 0.00% jvmSystem = 0.37% machineTotal = 3.87% } …. 実行結果:
  12. その他JVMの主なアップデート  358: Helpful NullPointerExceptions  370: Foreign-Memory Access API

    (Incubator)  364: ZGC on macOS / 365: ZGC on Windows  363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector  366: Deprecate the ParallelScavenge + SerialOld GC Combination  345: NUMA-Aware Memory Allocation for G1  Shenandoah GC向けの改修を細々と
  13. どうやって入れるの?  こだわりが無ければLinuxやクラウドなら環境標準でOK  WindowsやMacに入れる場合はLiberica JDKとかで良いと思う https://bell-sw.com/pages/java-14/  Oracle JDKとOpen

    JDKは今は同じコードベース  (問合せ対応がしたい等の)サポート入れなければ無料です  詳しく知りたい人はソムリエの資料を読みましょう https://www.slideshare.net/TakahiroYamada3/jdk- winery-tour-20191026-sfggjp-javajo
  14. まとめ  今回はホップ, ステップ, ジャンプのステップ感が強い。  基本的にはプレビューがメインだし運用環境に急いでインストールす るメリットは比較的小さい  ただし、監視にJFRを活用したい人は積極的に入れよう!

     ライブラリ等を作ってる人はプレビュー版から特にRecord型の感触を つかむと良いかも  いずれにしてもJavaがどんどん使いやすくなってるのが分かって良い