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

Naoki Kishida

October 03, 2020
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. View Slide

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

    View Slide

  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が出ればバグ修正など
    は行われなくなる。

    View Slide

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

    View Slide

  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としてまとめられている

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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
    新規 新規
    新規
    新規
    正式化
    正式化
    正式化
    新規

    View Slide

  10. 言語仕様
    • Text Blocks(Standard)
    • Pattern Matching for instanceof(Second Preview)
    • Sealed Classes(Preview)
    • Records(Second Preview)

    View Slide

  11. Text Blocks(Standard)
    • 複数行のテキスト
    • ダブルクオート3つで囲む
    • Java 13でpreviewとして入りJava 14でsecond preview
    • Java 14から変更なしでStandardに
    """

    Java 14

    """

    View Slide

  12. var s = """

    Java 14

    """;
    var s = """

    Java 14

    """;
    var s = """

    Java 14

    """;
    インデント
    • 一番ひだりにあわせられる
    ``の位置が基準
    閉じ側の`"""`の位置が基準
    ``の位置が基準

    View Slide

  13. TextBlocks関連のAPI
    • APIも`--enable-preview`なしで使えるようになった
    • stripIndent
    • 先頭の空白を取り除く
    • translateEscape
    • エスケープ文字を該当する文字に変換する
    • formatted
    • String.formatを後置で書けるようにする
    • たぶんJava 15で一番使う

    View Slide

  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());
    }

    View Slide

  15. Sealed Classes
    • 継承できるクラスを限定する
    public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

    View Slide

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

    View Slide

  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 "正方形";
    }
    }

    View Slide

  18. Records(2nd Preview)
    • データをやりとりするための型
    • イミュータブル(値が変更できない)
    • 名前付きタプル
    • Case class(Scala) やData class(Kotlin), @Value(lombok)

    View Slide

  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で宣言

    View Slide

  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
    }
    要素(コンポーネント)を定義

    View Slide

  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
    }
    中かっこが必要
    追加のメソッドなどの定義も可

    View Slide

  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

    View Slide

  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を継承

    View Slide

  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

    View Slide

  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
    }
    コンストラクタが定義される

    View Slide

  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ではない

    View Slide

  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
    }
    オブジェクトの基本メソッドも
    実装される

    View Slide

  28. Recordの利用
    • 利用時は普通のクラスと同様
    Rec r = new Rec("Java", 15);

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  34. Hidden Classes
    • 隠しクラス
    • フレームワークなどが実行時に生成したクラスをフレームワー
    クの外から見れないようにする
    • ラムダ式やSpring Frameworkなどは実行時にクラスを生成する
    • 外部から使えないことを保証することで、生成したクラスの
    破棄などが効率よく行えるようになる

    View Slide

  35. Reimplement the Legacy DatagramSocket
    • UDPソケット APIの再実装
    • Java 13でTCPソケットが再実装された(JEP 353)
    • 現代的なコードで書きなおすことでメンテナンスしやすくする
    • Project Loomで開発中の仮想スレッドに対応できるようにする

    View Slide

  36. Edwards-Curve Digital Signature Algorithm
    • ツイストエドワーズ曲線での署名の実装
    • Java 11で実装されたCurve25519 / Curve448の親戚(JEP 324)

    View Slide

  37. Unicode 13
    • Unicode 13に対応しました
    • Character.UnicodeBlockへの定数の追加など
    • ピーマンや忍者が使えます
    • Java 11でUnicode 10対応がJEPになって以降、Unicode対応は
    JEPを作らなくなった

    View Slide

  38. Foreign memory Access API
    • second incubator
    • 大量データを処理するために、GCで管理されないメモリを
    確保する
    • 標準ではないUnsafeを使っていたものを標準APIで実現する

    View Slide

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

    View Slide

  40. Remove the Nashorn JS Engine
    • Java 8で取り入れられたJavaScriptエンジンNashornが
    Java 15で削除された
    • もしJavaScriptエンジンが必要ならGraalVMのGraalJSを使う

    View Slide

  41. Deprecate RMI Activation for Removal
    • リモートメソッド呼び出しフレームワークであるRMIで、サー
    ビスを登録して必要に応じてオブジェクトを起動する仕組みが
    非推奨に
    • Java 8からはオプション機能になっている
    • 登録用サーバーであるrmidも同時に非推奨
    • そのうち消される

    View Slide

  42. JVM
    • Disable and Deprecate Biased Locking
    • ZGC: A Scalable Low-Latency GC(Production)
    • Shenandoah: A Low-Pause-Time GC(Production)

    View Slide

  43. Disable and Deprecate Biased Locking
    • Biased Locking
    • 並列処理用のCPU命令であるCAS(Compare and Swap)が昔は遅かっ
    たのでなるべく使いたくなかった
    • オブジェクトの競合が実際はあまり起こらない
    • ロックしたオブジェクトは結局同じスレッドで使うことが多い
    • 同じスレッドからのロックではCASを使わない
    • しかしCASが速くなったので不要に
    • まずは無効にして非推奨に

    View Slide

  44. ZGC
    • テラバイト級のメモリが扱えるGC
    • 停止時間を短くする
    • Java 11でExperimentalとして導入された
    • Java 15で正式機能になった

    View Slide

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

    View Slide

  46. Tool:
    Remove the RMI static stub compiler rmic
    • RMIで、呼び出し側で代わりに呼び出すためのスタブクラスを
    生成するツールrmicを削除
    • スタブクラスは実行時に自動的に作られるようになったため
    rmicで静的に生成する必要がなくなった

    View Slide

  47. OpenJDK
    Remove the Solaris and SPARC Ports
    • SolarisやSPARCプロセッサへの対応を削除する
    • ビルドプロセスから削除
    • SolarisやSPARCプロセッサ用のコードを削除する

    View Slide

  48. まとめ
    • 17LTSに向けての機能改善が着々と進んでいます
    • 少しずつ慣れながら17LTSが出たときに使えるようになりま
    しょう
    • もちろん15をガンガン使ってもいいと思う

    View Slide