Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Java 15を軽く紹介 / Java 15 at a glance
Search
Naoki Kishida
October 03, 2020
Programming
1
220
Java 15を軽く紹介 / Java 15 at a glance
Java 15の紹介
こちらの動画で使っている資料です
https://www.youtube.com/watch?v=boybNnoiYbw
Naoki Kishida
October 03, 2020
Tweet
Share
More Decks by Naoki Kishida
See All by Naoki Kishida
Java Webフレームワークの現状 / java web framework
kishida
9
9.6k
Is Object Oriented nesessary? COSCUP 2024
kishida
0
130
プログラムに組み込みたい人向けLLMの概要 / LLM for programmers
kishida
3
420
Javaの現状2024夏 / Java current status 2024 summer
kishida
5
1.9k
Java 22 Overview
kishida
1
320
Is Object-Oriented nessesary?
kishida
0
100
オブジェクト指向は必要なのか / Is object-oriented needed?
kishida
36
25k
AI時代を乗り切る実装力をつけよう / Get avility of implementation beyond AI era
kishida
4
7.4k
AI時代を生き抜くために処理をちゃんと書けるようになろう / write a executable process for AI era
kishida
27
16k
Other Decks in Programming
See All in Programming
Outline View in SwiftUI
1024jp
1
330
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
480
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編
oniak3ibm
PRO
1
140
みんなでプロポーザルを書いてみた
yuriko1211
0
280
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
960
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
Jakarta EE meets AI
ivargrimstad
0
120
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
130
C++でシェーダを書く
fadis
6
4.1k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
YesSQL, Process and Tooling at Scale
rocio
169
14k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Practical Orchestrator
shlominoach
186
10k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Agile that works and the tools we love
rasmusluckow
327
21k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Transcript
None
Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP
http://openjdk.java.net/projects/jdk/15/
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が出ればバグ修正など は行われなくなる。
Java 15 • 2020/9/15リリース • non-LTS • 次のLTSは17(Sept.2021) • 14のJEP
http://openjdk.java.net/projects/jdk/15/
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としてまとめられている
Java 15 • 2020/9/15リリース • non-LTS • 次は17(Sept.2021) • 14のJEP
• 新規は4つ • 更新6(正式化3) • 機能削除4 http://openjdk.java.net/projects/jdk/15/ 新規 新規 新規 新規 正式化 正式化 正式化
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
ダウンロードサイト • 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
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 新規 新規 新規 新規 正式化 正式化 正式化 新規
言語仕様 • Text Blocks(Standard) • Pattern Matching for instanceof(Second Preview)
• Sealed Classes(Preview) • Records(Second Preview)
Text Blocks(Standard) • 複数行のテキスト • ダブルクオート3つで囲む • Java 13でpreviewとして入りJava 14でsecond
preview • Java 14から変更なしでStandardに """ <head> <title>Java 14</title> </head> """
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>`の位置が基準
TextBlocks関連のAPI • APIも`--enable-preview`なしで使えるようになった • stripIndent • 先頭の空白を取り除く • translateEscape •
エスケープ文字を該当する文字に変換する • formatted • String.formatを後置で書けるようにする • たぶんJava 15で一番使う
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()); }
Sealed Classes • 継承できるクラスを限定する public abstract sealed class Shape permits
Circle, Rectangle, Square {...}
現状では使い道なし • 本当は次のように書けるといい • if-elseラダーでの網羅性の保証は難しい String getName(Shape s) { if
(s instanceof Circle) { return "円"; } else if (s instanceof Rectangle) { return "四角"; } else if (s instanceof Square) { return "正方形"; } }
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 "正方形"; } }
Records(2nd Preview) • データをやりとりするための型 • イミュータブル(値が変更できない) • 名前付きタプル • Case
class(Scala) やData class(Kotlin), @Value(lombok)
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で宣言
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の定義 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の定義 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
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を継承
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
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の定義 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ではない
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の利用 • 利用時は普通のクラスと同様 Rec r = new Rec("Java", 15);
カノニカル(正規)コンストラクタ • コンポーネントと同じパラメータとフィールド初期化が必要 record Rec(String name, int count) { Rec(String
name, int count) { this.name = name; this.count = Math.max(count, 0); } } コンポーネントと同じ パラメータが必要
カノニカル(正規)コンストラクタ • コンポーネントと同じパラメータとフィールド初期化が必要 record Rec(String name, int count) { Rec(String
name, int count) { this.name = name; this.count = Math.max(count, 0); } } フィールド初期化が必須
コンパクトコンストラクタ • 必ず書かないといけないものは省略していいのでは? record Rec(String name, int count) { Rec
{ count = Math.max(count, 0); } } パラメータを省略
コンパクトコンストラクタ • 必ず書かないといけないものは省略していいのでは? record Rec(String name, int count) { Rec
{ count = Math.max(count, 0); } } フィールドを初期化してはいけない
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
Hidden Classes • 隠しクラス • フレームワークなどが実行時に生成したクラスをフレームワー クの外から見れないようにする • ラムダ式やSpring Frameworkなどは実行時にクラスを生成する
• 外部から使えないことを保証することで、生成したクラスの 破棄などが効率よく行えるようになる
Reimplement the Legacy DatagramSocket • UDPソケット APIの再実装 • Java 13でTCPソケットが再実装された(JEP
353) • 現代的なコードで書きなおすことでメンテナンスしやすくする • Project Loomで開発中の仮想スレッドに対応できるようにする
Edwards-Curve Digital Signature Algorithm • ツイストエドワーズ曲線での署名の実装 • Java 11で実装されたCurve25519 /
Curve448の親戚(JEP 324)
Unicode 13 • Unicode 13に対応しました • Character.UnicodeBlockへの定数の追加など • ピーマンや忍者が使えます •
Java 11でUnicode 10対応がJEPになって以降、Unicode対応は JEPを作らなくなった
Foreign memory Access API • second incubator • 大量データを処理するために、GCで管理されないメモリを 確保する
• 標準ではないUnsafeを使っていたものを標準APIで実現する
Math.absExact • MIN_VALUEでabsをとるとMIN_VALUEになってしまう • 絶対値がマイナスになる • absExactだと例外が投げられる • Mathクラス、StrictMathクラスでint・longに対応したものが 実装されている
Remove the Nashorn JS Engine • Java 8で取り入れられたJavaScriptエンジンNashornが Java 15で削除された
• もしJavaScriptエンジンが必要ならGraalVMのGraalJSを使う
Deprecate RMI Activation for Removal • リモートメソッド呼び出しフレームワークであるRMIで、サー ビスを登録して必要に応じてオブジェクトを起動する仕組みが 非推奨に •
Java 8からはオプション機能になっている • 登録用サーバーであるrmidも同時に非推奨 • そのうち消される
JVM • Disable and Deprecate Biased Locking • ZGC: A
Scalable Low-Latency GC(Production) • Shenandoah: A Low-Pause-Time GC(Production)
Disable and Deprecate Biased Locking • Biased Locking • 並列処理用のCPU命令であるCAS(Compare
and Swap)が昔は遅かっ たのでなるべく使いたくなかった • オブジェクトの競合が実際はあまり起こらない • ロックしたオブジェクトは結局同じスレッドで使うことが多い • 同じスレッドからのロックではCASを使わない • しかしCASが速くなったので不要に • まずは無効にして非推奨に
ZGC • テラバイト級のメモリが扱えるGC • 停止時間を短くする • Java 11でExperimentalとして導入された • Java
15で正式機能になった
Shenandoah • 数百ギガバイトまでを扱えるGC • 停止時間を短くする • G1GCの拡張 • Java 12でExperimentalとして導入された
• Java 15で正式化
Tool: Remove the RMI static stub compiler rmic • RMIで、呼び出し側で代わりに呼び出すためのスタブクラスを
生成するツールrmicを削除 • スタブクラスは実行時に自動的に作られるようになったため rmicで静的に生成する必要がなくなった
OpenJDK Remove the Solaris and SPARC Ports • SolarisやSPARCプロセッサへの対応を削除する •
ビルドプロセスから削除 • SolarisやSPARCプロセッサ用のコードを削除する
まとめ • 17LTSに向けての機能改善が着々と進んでいます • 少しずつ慣れながら17LTSが出たときに使えるようになりま しょう • もちろん15をガンガン使ってもいいと思う