Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

ダウンロードサイト • 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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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