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

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

Avatar for koduki koduki
March 21, 2020
250

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

Avatar for koduki

koduki

March 21, 2020
Tweet

More Decks by koduki

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がどんどん使いやすくなってるのが分かって良い