Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Java 15を軽く紹介 / Java 15 at a glance
Search
Naoki Kishida
October 03, 2020
Programming
290
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Java 15を軽く紹介 / Java 15 at a glance
Java 15の紹介
こちらの動画で使っている資料です
https://www.youtube.com/watch?v=boybNnoiYbw
Naoki Kishida
October 03, 2020
More Decks by Naoki Kishida
See All by Naoki Kishida
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
170
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
780
Java 27新機能 / Java 27 new features
kishida
2
230
ローカルLLMでどこまでコードが書けるか -LLM基礎知識 / How much code can be written on a local LLM - fundamental knowledge
kishida
10
11k
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.5k
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
430
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
5.7k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
280
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
660
Other Decks in Programming
See All in Programming
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
16k
SREの越境 / SRE Collaboration
y0hgi
2
310
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
420
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
170
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
340
contenteditable と日本語入力に向き合う
colorful12
0
190
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
180
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
470
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.4k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
A better future with KSS
kneath
240
18k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Odyssey Design
rkendrick25
PRO
2
870
Why Our Code Smells
bkeepers
PRO
340
58k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
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をガンガン使ってもいいと思う