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

Java 15を軽く紹介 / Java 15 at a glance

Java 15を軽く紹介 / Java 15 at a glance

Java 15の紹介
こちらの動画で使っている資料です
https://www.youtube.com/watch?v=boybNnoiYbw

9e840766611f942c7c0a9ad6987a5d78?s=128

Naoki Kishida

October 03, 2020
Tweet

Transcript

  1. None
  2. Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP

    http://openjdk.java.net/projects/jdk/15/
  3. Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP

    http://openjdk.java.net/projects/jdk/15/ LTS(Long Term Support) 長期サポート 6バージョンごとにLTSが設定されて長期間の サポートが行われる。 現在のLTSは11で、次回は17。 15はLTSではないので16が出ればバグ修正など は行われなくなる。
  4. Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP

    http://openjdk.java.net/projects/jdk/15/
  5. Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP

    http://openjdk.java.net/projects/jdk/15/ JEP(JDK Enhancement Proposal) 機能改善のまとめ 主な仕様変更はJEPとしてまとめられている
  6. Java 15 • 2020/9/15リリース • non-LTS • 次は17(Sept.2021) • 14のJEP

    • 新規は4つ • 更新6(正式化3) • 機能削除4 http://openjdk.java.net/projects/jdk/15/ 新規 新規 新規 新規 正式化 正式化 正式化
  7. Java 15 • 2020/9/15リリース • non-LTS • 次は17(Sept.2021) • 14のJEP

    • 新規は4つ • 更新6(正式化3) • 機能削除4 http://openjdk.java.net/projects/jdk/15/ 新規 新規 新規 新規 正式化 正式化 正式化 Javaの試用機能 大きな新機能について試用版として導入することで フィードバックを得やすくしてよりよい機能を提供 できるようにする • 言語機能:Preview • API:Incubator • JVM機能:Experimental
  8. ダウンロードサイト • Oracle OpenJDK • http://jdk.java.net/15/ • AdoptOpenJDK • https://adoptopenjdk.net/?variant=openjdk15&jvmVariant=hotspot

    • Amazon Corretto • https://github.com/corretto/corretto-jdk/releases/tag/15.0.0.36.1 • Azul Zulu Community • https://jp.azul.com/downloads/zulu-community/?architecture=x86-64- bit&package=jdk • Liberica JDK • https://bell-sw.com/pages/java-15/ • Oracle JDK • https://www.oracle.com/java/technologies/javase-jdk15-downloads.html
  9. JEP • 言語仕様 • Sealed Classes(Preview) • Text Blocks(Standard) •

    Records(Second Prevew) • Pattern Matching for instanceof (Second Preview) • JVM • Disable and Deprecate Biased Locking • ZGC(Production) • Shenandoah(Production) • Tool • remove RMI stub compiler • API • Hidden Classes • Reimplement the Legacy DatagramSocket API • Edwards-Curve Digital Signature Algorithm • Unicode 13 • Foreign Memory Access (Second Incubator) • Deprecate RMI Activation • Remove the Nashorn JS Engine • OpenJDK • Remove Solaris and SPARK Ports 新規 新規 新規 新規 正式化 正式化 正式化 新規
  10. 言語仕様 • Text Blocks(Standard) • Pattern Matching for instanceof(Second Preview)

    • Sealed Classes(Preview) • Records(Second Preview)
  11. Text Blocks(Standard) • 複数行のテキスト • ダブルクオート3つで囲む • Java 13でpreviewとして入りJava 14でsecond

    preview • Java 14から変更なしでStandardに """ <head> <title>Java 14</title> </head> """
  12. var s = """ <head> <title>Java 14</title> </head> """; var

    s = """ <head> <title>Java 14</title> </head> """; var s = """ <head> <title>Java 14</title> </head> """; インデント • 一番ひだりにあわせられる `<head>`の位置が基準 閉じ側の`"""`の位置が基準 `<head>`の位置が基準
  13. TextBlocks関連のAPI • APIも`--enable-preview`なしで使えるようになった • stripIndent • 先頭の空白を取り除く • translateEscape •

    エスケープ文字を該当する文字に変換する • formatted • String.formatを後置で書けるようにする • たぶんJava 15で一番使う
  14. Pattern Matching for instanceof(2nd Preview) • Kotlinのスマートキャストのような機能 Object o =

    "test"; if (o instanceof String s) { System.out.println(s.length()); } Object o = "test"; if (o instanceof String) { String s = (String) o; System.out.println(s.length()); }
  15. Sealed Classes • 継承できるクラスを限定する public abstract sealed class Shape permits

    Circle, Rectangle, Square {...}
  16. 現状では使い道なし • 本当は次のように書けるといい • if-elseラダーでの網羅性の保証は難しい String getName(Shape s) { if

    (s instanceof Circle) { return "円"; } else if (s instanceof Rectangle) { return "四角"; } else if (s instanceof Square) { return "正方形"; } }
  17. swtichでパターンマッチングが使えるように なると便利 • Pattern matching for switchが導入されると、次のような switchがdefaultなしで書けるようになる String getName(Shape

    s) { switch (s) { case Circle c -> return "円"; case Rectangle r -> return "四角"; case Square q -> return "正方形"; } }
  18. Records(2nd Preview) • データをやりとりするための型 • イミュータブル(値が変更できない) • 名前付きタプル • Case

    class(Scala) やData class(Kotlin), @Value(lombok)
  19. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } recordで宣言
  20. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } 要素(コンポーネント)を定義
  21. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } 中かっこが必要 追加のメソッドなどの定義も可
  22. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } 暗黙にfinal
  23. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } java.lang.Recordを継承
  24. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } コンポーネントに 対応するフィールド private final
  25. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } コンストラクタが定義される
  26. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } コンポーネントと同名の アクセスメソッド getterではない
  27. Recordの定義 public record Rec(String name, int count) {} public final

    class Rec extends Record { private final String name; private final int count; Rec(String name, int count) { this.name = name; this.count = count; } String name() { return name; } String count() { return count; } // toString, equals, hashCode } オブジェクトの基本メソッドも 実装される
  28. Recordの利用 • 利用時は普通のクラスと同様 Rec r = new Rec("Java", 15);

  29. カノニカル(正規)コンストラクタ • コンポーネントと同じパラメータとフィールド初期化が必要 record Rec(String name, int count) { Rec(String

    name, int count) { this.name = name; this.count = Math.max(count, 0); } } コンポーネントと同じ パラメータが必要
  30. カノニカル(正規)コンストラクタ • コンポーネントと同じパラメータとフィールド初期化が必要 record Rec(String name, int count) { Rec(String

    name, int count) { this.name = name; this.count = Math.max(count, 0); } } フィールド初期化が必須
  31. コンパクトコンストラクタ • 必ず書かないといけないものは省略していいのでは? record Rec(String name, int count) { Rec

    { count = Math.max(count, 0); } } パラメータを省略
  32. コンパクトコンストラクタ • 必ず書かないといけないものは省略していいのでは? record Rec(String name, int count) { Rec

    { count = Math.max(count, 0); } } フィールドを初期化してはいけない
  33. API • Hidden Classes • Reimplement the Legacy DatagramSocket API

    • Edwards-Curve Digital Signature Algorithm • Unicode 13(no JEP) • Foreign Memory Access API(Second Incubator) • Math.absExact(no JEP) • Remove the Nashorn JS Engine • Deprecate RMI Activation for Removal
  34. Hidden Classes • 隠しクラス • フレームワークなどが実行時に生成したクラスをフレームワー クの外から見れないようにする • ラムダ式やSpring Frameworkなどは実行時にクラスを生成する

    • 外部から使えないことを保証することで、生成したクラスの 破棄などが効率よく行えるようになる
  35. Reimplement the Legacy DatagramSocket • UDPソケット APIの再実装 • Java 13でTCPソケットが再実装された(JEP

    353) • 現代的なコードで書きなおすことでメンテナンスしやすくする • Project Loomで開発中の仮想スレッドに対応できるようにする
  36. Edwards-Curve Digital Signature Algorithm • ツイストエドワーズ曲線での署名の実装 • Java 11で実装されたCurve25519 /

    Curve448の親戚(JEP 324)
  37. Unicode 13 • Unicode 13に対応しました • Character.UnicodeBlockへの定数の追加など • ピーマンや忍者が使えます •

    Java 11でUnicode 10対応がJEPになって以降、Unicode対応は JEPを作らなくなった
  38. Foreign memory Access API • second incubator • 大量データを処理するために、GCで管理されないメモリを 確保する

    • 標準ではないUnsafeを使っていたものを標準APIで実現する
  39. Math.absExact • MIN_VALUEでabsをとるとMIN_VALUEになってしまう • 絶対値がマイナスになる • absExactだと例外が投げられる • Mathクラス、StrictMathクラスでint・longに対応したものが 実装されている

  40. Remove the Nashorn JS Engine • Java 8で取り入れられたJavaScriptエンジンNashornが Java 15で削除された

    • もしJavaScriptエンジンが必要ならGraalVMのGraalJSを使う
  41. Deprecate RMI Activation for Removal • リモートメソッド呼び出しフレームワークであるRMIで、サー ビスを登録して必要に応じてオブジェクトを起動する仕組みが 非推奨に •

    Java 8からはオプション機能になっている • 登録用サーバーであるrmidも同時に非推奨 • そのうち消される
  42. JVM • Disable and Deprecate Biased Locking • ZGC: A

    Scalable Low-Latency GC(Production) • Shenandoah: A Low-Pause-Time GC(Production)
  43. Disable and Deprecate Biased Locking • Biased Locking • 並列処理用のCPU命令であるCAS(Compare

    and Swap)が昔は遅かっ たのでなるべく使いたくなかった • オブジェクトの競合が実際はあまり起こらない • ロックしたオブジェクトは結局同じスレッドで使うことが多い • 同じスレッドからのロックではCASを使わない • しかしCASが速くなったので不要に • まずは無効にして非推奨に
  44. ZGC • テラバイト級のメモリが扱えるGC • 停止時間を短くする • Java 11でExperimentalとして導入された • Java

    15で正式機能になった
  45. Shenandoah • 数百ギガバイトまでを扱えるGC • 停止時間を短くする • G1GCの拡張 • Java 12でExperimentalとして導入された

    • Java 15で正式化
  46. Tool: Remove the RMI static stub compiler rmic • RMIで、呼び出し側で代わりに呼び出すためのスタブクラスを

    生成するツールrmicを削除 • スタブクラスは実行時に自動的に作られるようになったため rmicで静的に生成する必要がなくなった
  47. OpenJDK Remove the Solaris and SPARC Ports • SolarisやSPARCプロセッサへの対応を削除する •

    ビルドプロセスから削除 • SolarisやSPARCプロセッサ用のコードを削除する
  48. まとめ • 17LTSに向けての機能改善が着々と進んでいます • 少しずつ慣れながら17LTSが出たときに使えるようになりま しょう • もちろん15をガンガン使ってもいいと思う