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
240
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
LLMベースAIの基本 / basics of LLM based AI
kishida
12
3.1k
Java 24まとめ / Java 24 summary
kishida
3
620
AI時代のプログラミング教育 / programming education in ai era
kishida
25
25k
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
10
2.5k
AI時代に求められるプログラマの能力 / ability of programmer in AI era
kishida
19
13k
Java 23の概要とJava Web Frameworkの現状 / Java 23 and Java web framework
kishida
2
530
Java Webフレームワークの現状 / java web framework
kishida
10
11k
Is Object Oriented nesessary? COSCUP 2024
kishida
0
190
プログラムに組み込みたい人向けLLMの概要 / LLM for programmers
kishida
3
760
Other Decks in Programming
See All in Programming
Code as Context 〜 1にコードで 2にリンタ 34がなくて 5にルール? 〜
yodakeisuke
0
100
KotlinConf 2025 現地で感じたServer-Side Kotlin
n_takehata
1
230
Is Xcode slowly dying out in 2025?
uetyo
1
190
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
220
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
490
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
Bytecode Manipulation 으로 생산성 높이기
bigstark
2
370
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
190
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
1
320
C++20 射影変換
faithandbrave
0
520
Benchmark
sysong
0
250
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
150
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
940
Facilitating Awesome Meetings
lara
54
6.4k
Done Done
chrislema
184
16k
Raft: Consensus for Rubyists
vanstee
140
7k
Thoughts on Productivity
jonyablonski
69
4.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Practical Orchestrator
shlominoach
188
11k
Faster Mobile Websites
deanohume
307
31k
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をガンガン使ってもいいと思う