Slide 1

Slide 1 text

みんな大好きJava 8から9月リリースJava 17まで! 最近の Java あれこれ

Slide 2

Slide 2 text

Speakers まーや(@maaya8585) ● プリセールス ● Java/Python/Azure ● 最近気になるのはHL7 FHIR mii(@miitan_m1004) ● サーバサイドエンジニ ア ● Java 8 ● そろそろバージョン アップしたい よこな(@ihcomega) ● デベロッパーアドボケ イト ● (元)Scala/Ruby ● インフラ方面を学ばな いと

Slide 3

Slide 3 text

1. ぼんやりわかった気になるJava言語入門 2. Java 8 -> Java 16 ゆるふわきゃっちあっぷ 3. 先取り!Java 17 リリース予定機能 3 Agenda

Slide 4

Slide 4 text

ぼんやりわかった気になる Java言語入門 そもそもJavaってなんなの?コーヒーなの? 4

Slide 5

Slide 5 text

● 1995年5月23日生まれ ● サン・マイクロシステムズ社のジェームス・ゴスリン率いるプロ ジェクトチームによって開発 ● 当初Project Oakと名乗っていたが、すでにOakが商標登録さ れてしまっていたため、「次の名前どうしよ?」と相談していた場 所でコーヒー飲んでたのでJavaになった 5 What is Java

Slide 6

Slide 6 text

● 言語思想:Write once, run anywhere 6 What is Java Headware Windows OS Mac OS Linux OS Windows Java VM Mac Java VM Linux Java VM Java application ● JRE : Java Runtime Environment. 実行だけができるキット ● JDK: Java Development Kit. 開発時に必要なキット

Slide 7

Slide 7 text

7 JVM brothers Android Java Kotlin Scala Groovy Clojure Headware Windows OS Mac OS Linux OS Windows JVM Mac JVM Linux JVM etc….

Slide 8

Slide 8 text

8 Java specification Java Community Process OpenJDK (実装OSSグループ) Oracle (商標持ち) ● 仕様リクエスト(JSR)を元に仕様 策定・改定 ● リリース承認(TCK etc.) etc. ● メインスポンサー ● OpenJDKへバイナリ無償提供 etc. ● 開発・実装 ● スケジューリング ● (バイナリなし) etc. JCPmemberは個人でも 企業/団体でも登録するこ とができるよ JSR: Java Specification Request

Slide 9

Slide 9 text

9 Java specification Java Community Process OpenJDK (実装OSSグループ) Oracle (商標持ち) RedHat OpenJDK Amazon Corretto AdaptOpenJDK Azul Zulu etc…. ● 仕様リクエスト(JSR)を元に仕様 策定・改定 ● リリース承認(TCK etc.) etc. ● メインスポンサー ● OpenJDKへバイナリ無償提供 etc. ● 開発・実装 ● スケジューリング ● (バイナリなし) etc. ● 実装 ● サポート ● バイナリ提供 etc. JCPmemberは個人でも 企業/団体でも登録するこ とができるよ Oracle OpenJDK JSR: Java Specification Request

Slide 10

Slide 10 text

10 [FYI] Java 16 organizations https://blogs.oracle.com/java-platform-group/the-arrival-of-java-16

Slide 11

Slide 11 text

11 What is ”Java” ● Java Technical Compatibility Kit (TCK) ○ この認定を通ってないと「私は正式JDKです」と名乗れないことになっている ○ Google とOracleの訴訟問題とかはこのあたりが絡んでくるんだけど複雑か つながーいお話なので今日は省略 ■ https://www.slideshare.net/yusuke/javaossandroid-javaapi ■ https://arclamp.hatenablog.com/entry/2021/04/08/211358

Slide 12

Slide 12 text

12 Version Java X 機能リスト ● Xxxxx ● Xxxx ● xxxxx 2年目安に やってこー! Java 8 までのリリース管理

Slide 13

Slide 13 text

13 Version Java X 機能リスト ● Xxxxx ● Xxxx ● xxxxx OpenJDK JCP あーでもない こーでもない 2年目安に やってこー! Java 8 までのリリース管理

Slide 14

Slide 14 text

14 Version Java X 機能リスト ● Xxxxx ● Xxxx ● xxxxx OpenJDK JCP あーでもない こーでもない 2年目安に やってこー! はっ! 予定過ぎてた!! リリースしようぜ Java 8 までのリリース管理

Slide 15

Slide 15 text

15 Version Java X 機能リスト ● xxxx ● Xxxx ● xxxxx OpenJDK JCP あーでもない こーでもない 2年目安に やってこー! バージョン リリース J2SE 1.4 2002年2月 J2SE 5.0 2004年9月 Java 6 2006年12月 Java 7 2011年7月 Java 8 2014年3月 Java 9 2017年9月 些末な機能は マイナーバージョンでリリース はっ! 予定過ぎてた!! リリースしようぜ Java 8 までのリリース管理

Slide 16

Slide 16 text

16 Version Java 9 以降のリリース管理 JEP xxxx OpenJDK JCP あーでもない こーでもない JEP xxxx JEP xxxx JSR xxxx JSR xxxx JEP: JDK Enhancement Proposals

Slide 17

Slide 17 text

17 Version リリースの時期ですよー! リリースできるプロジェク ト教えてー! Java 9 以降のリリース管理 JEP xxxx OpenJDK JCP あーでもない こーでもない JEP xxxx JEP xxxx JSR xxxx JSR xxxx JEP: JDK Enhancement Proposals

Slide 18

Slide 18 text

18 Version リリースの時期ですよー! リリースできるプロジェク ト教えてー! Java X リリース! ● Xxxxx ● Xxxx ● xxxxx Java 9 以降のリリース管理 3月 / 9月 の年2回 JEP xxxx OpenJDK JCP あーでもない こーでもない JEP xxxx JEP xxxx JSR xxxx JSR xxxx JEP: JDK Enhancement Proposals

Slide 19

Slide 19 text

19 Version Java 9 以降のリリース管理 ● New バージョンリリース : 半年に一回 ○ 新しいバージョンが出ると一つ前のバージョンがEoL ● Long Time Support(LTS) : 3年に1回 9 10 11 12 13 14 15 16 17 18 19 8 2018/09 2021/03 2021/09 2017/09

Slide 20

Slide 20 text

20 Java is still free. https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit#heading=h.p3qt2oh5eczi ● 基本的な有償無償の区別方法は変化なし ○ OSS版は無償。ただしEoL期限が変更になった ○ サポートが必要であれば有償ライセンスを各企業から購入 ○ リリースサイクルが変わっただけ

Slide 21

Slide 21 text

21 Java is still free. https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit#heading=h.p3qt2oh5eczi ● 基本的な有償無償の区別方法は変化なし ○ OSS版は無償。ただしEoL期限が変更になった ○ サポートが必要であれば有償ライセンスを各企業から購入 ○ リリースサイクルが変わっただけ 同じタイミングでOracle OpenJDKのライセンス体 系変更&Oracle OpenJDK固有機能のOSS譲渡 が行われたので混乱を招いた

Slide 22

Slide 22 text

22 Java is still free. https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit#heading=h.p3qt2oh5eczi ● 基本的な有償無償の区別方法は変化なし ○ OSS版は無償。ただしEoL期限が変更になった ○ サポートが必要であれば有償ライセンスを各企業から購入 ○ リリースサイクルが変わっただけ ● OSSとは貢献の対価として利用できる恩恵を受けるもの ○ 個人であれ企業であれ恩恵を受けたなら貢献で返すべし 同じタイミングでOracle OpenJDKのライセンス体 系変更&Oracle OpenJDK固有機能のOSS譲渡 が行われたので混乱を招いた

Slide 23

Slide 23 text

Java 8 -> Java 16 ゆるふわきゃっちあっぷ 最近のJavaをゆるっとつまみぐい! 23

Slide 24

Slide 24 text

24 バージョン リリース 増えた・減った Java8 2014/3 ラムダ式、Stream API Java9 2017/9 モジュールシステム、JShell、Applet、Java Web Start Java10 2018/3 ローカル変数型推論 Java11 2018/9 単一ファイル実行(javaコマンドでソースファイルを直接実行できる)、 JavaEE Java12 2019/3 Java13 2019/9 Java14 2020/3 Switch式 Java15 2020/9 テキストブロック Java16 2021/3 レコード、パターンマッチング バージョンアップで増えたり減ったり󰝋

Slide 25

Slide 25 text

25 ・標準ライブラリに便利な機能が増えたよ!  (CollectionやStream、File I/O、HTTP Client APIなどなど) ・Docker対応したよ! (CPU数やメモリの制限が効くようになったよ。 →Java8にも取り込まれたよ!) ・例外メッセージがわかりやすくなったよ! ・javadocで生成されるHTMLドキュメントがパワーアップしたよ! ・クラスデータの扱いやガベージコレクタ( GC)の改善や変更も入ったよ! 他にも・・・ 参考: みんなのJava OpenJDKから始まる大変革期! https:/ /gihyo.jp/book/2020/978-4-297-11199-1 きしださんのJava新機能まとめ https:/ /qiita.com/nowokay JEP https:/ /openjdk.java.net/jeps/0

Slide 26

Slide 26 text

ローカル変数がvarで宣言できるようになったよ🎉(Java10) 26 Local-Variable Type Inference JEP 286: Local-Variable Type Inference http:/ /openjdk.java.net/jeps/286 ローカル変数の宣言で型名の代わりに varが使えるようになりました! 型名を省略してすっきり書けるよ! クラスのフィールドは対象外です。

Slide 27

Slide 27 text

27 Local-Variable Type Inference 型を書くのを省略できるだけで、変数の型は存在してるよ! 一度初期化した変数🔢に、異なる型の値🔠は入れられません。 初期化しなかったり、nullで初期化した場合は型が推論できなくて怒られます 👹

Slide 28

Slide 28 text

switch式で値が返せるようになったよ🎉(Java14) 28 Switch Expressions JEP 361: Switch Expressions https:/ /openjdk.java.net/jeps/361 String kibun; switch(day) { case MONDAY: kibun = "かなり憂鬱"; break; case FRIDAY: case SATURDAY: kibun = "とっても元気"; break; case SUNDAY: kibun = "ちょっぴり憂鬱"; break; default: kibun = "普通"; }; String kibun = switch (day) { case MONDAY -> "かなり憂鬱"; case FRIDAY, SATURDAY -> "とっても元気"; case SUNDAY -> "ちょっぴり憂鬱"; default -> "普通"; }; Java13までのswitch文 switch式 System.out.print (switch (day) { case MONDAY -> "かなり憂鬱"; case FRIDAY, SATURDAY -> "とっても元気"; case SUNDAY -> "ちょっぴり憂鬱"; default -> "普通"; });

Slide 29

Slide 29 text

29 Switch Expressions ->をswitch文で使うこともできます!breakがいらないよ🌸 String kibun; switch (day) { case FRIDAY, SATURDAY -> kibun = "とっても元気"; case SUNDAY -> kibun = "ちょっぴり憂鬱"; case MONDAY -> kibun = "かなり憂鬱"; default -> kibun = "普通"; }; String kibun = switch (day) { case MONDAY: yield "かなり憂鬱"; case FRIDAY: case SATURDAY: yield "とっても元気"; case SUNDAY: yield "ちょっぴり憂鬱"; default: yield "普通"; }; Switch式で : を使った書き方もできます○ その場合はyieldで値を返すよ!

Slide 30

Slide 30 text

長いテキストをテキストブロックで書けるようになったよ🎉(Java15) 30 Text Block JEP 378: Text Blocks https:/ /openjdk.java.net/jeps/378 ”””で囲んだ文字列を一つのStringとして扱えるよ!”””

Slide 31

Slide 31 text

Recordクラスが作れるようになったよ🎉(Java16) 31 Record データを持つためのRecordというクラスが新しく作られたよ! JEP 395: Records https:/ /openjdk.java.net/jeps/395 record Point(int x, int y) { }; Point.class.getMethods(); ==> Method[11] { public final boolean Point.equals(java.lang.Object), public final java.lang.String Point.toString(), public final int Point.hashCode(), public int Point.x(), // xのgetter public int Point.y(), // yのgetter public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll() } Recordにはコンストラクタやgetter、equalsメソッドが自動で作られるので、 イミュータブル(不変)なデータクラスが簡単に実装できるよ!

Slide 32

Slide 32 text

32 Record 実際に使ってみるとこんな感じ! メソッドを上書きしたり、新しいメソッドを追加することもできるよ。

Slide 33

Slide 33 text

型の判定とキャストがまとめてできるようになったよ🎉(Java16) 33 Pattern Matching for instance of Java15まで JEP 394: Pattern Matching for instanceof https:/ /openjdk.java.net/jeps/394 If (obj instanceOf String) { String message = (String)obj; System.out.print(message); }; これはStringかな?→Stringならprintしよう!と思った時に・・・ Java16 If (obj instanceOf String message) { System.out.print(message); }; 将来的にはSwitch式などでもパターンマッチングが使えるようになる!(はず)

Slide 34

Slide 34 text

34 バージョン リリース 増えた・減った Java8 2014/3 ラムダ式、Stream API Java9 2017/9 モジュールシステム、JShell、Applet、Java Web Start Java10 2018/3 ローカル変数型推論 Java11 2018/9 単一ファイル実行(javaコマンドでソースファイルを直接実行できる)、 JavaEE Java12 2019/3 Java13 2019/9 Java14 2020/3 Switch式 Java15 2020/9 テキストブロック Java16 2021/3 レコード、パターンマッチング 🏅最新バージョンに追いつきました!やったね🏅

Slide 35

Slide 35 text

先取り! Java 17 リリース予定機能 次は一体何がやってくるんだ 35

Slide 36

Slide 36 text

36 The Next Version ● JDK 17 がリリースされるよ ○ リリース日は 2021/09/14 の予定 ○ 17はLTSに該当 ● 未来のJavaについて知る ○ フィーチャーを知る: https://openjdk.java.net/projects/jdk/17/ ○ ダウンロードして使う: ■ https://jdk.java.net/17/ ■ SDKMAN <- オススメ! ○ ソースコードを見る: https://github.com/openjdk/ (16からGitHubへ)

Slide 37

Slide 37 text

● Restore Always-Strict Floating-Point Semantics ● Enhanced Pseudo-Random Number Generators ● New macOS Rendering Pipeline ● macOS/AArch64 Port ● Deprecate the Applet API for Removal ● Strongly Encapsulate JDK Internals ● Pattern Matching for switch (Preview) ● Remove RMI Activation ● Sealed Classes ● Remove the Experimental AOT and JIT Compiler ● Deprecate the Security Manager for Removal ● Foreign Function & Memory API (Incubator) ● Vector API (Second Incubator) ● Context-Specific Deserialization Filters 37 New Features

Slide 38

Slide 38 text

38 Difference of Preview and Incubator ● Preview (JEP 12〜) ○ 仕様が決まり実装もされているが一時的に入れられている機能 ○ 実際使った後のフィードバックを受けた後、将来のJavaに入る ○ 起動時に--enable-previewというオプションをつけると有効になる ● Incubator ○ モジュール“jdk.incubator”で分離されて試験的に導入される機能 ● Experimental ○ VMレベルの未完成・不安定だが試験的に導入される機能

Slide 39

Slide 39 text

● Restore Always-Strict Floating-Point Semantics ● Enhanced Pseudo-Random Number Generators ● New macOS Rendering Pipeline ● macOS/AArch64 Port ● Deprecate the Applet API for Removal ● Strongly Encapsulate JDK Internals ● Pattern Matching for switch (Preview) ● Remove RMI Activation ● Sealed Classes ● Remove the Experimental AOT and JIT Compiler ● Deprecate the Security Manager for Removal ● Foreign Function & Memory API (Incubator) ● Vector API (Second Incubator) ● Context-Specific Deserialization Filters 39 New Features

Slide 40

Slide 40 text

40 Take a Quick Look ● Restore Always-Strict Floating-Point Semantics ○ 浮動小数点を使った処理でstrictfpがデフォルトになる ● Enhanced Pseudo-Random Number Generators ○ 疑似乱数発生機が改善される (新しいインターフェースの追加、コードの整 理など) ● New macOS Rendering Pipeline ○ Apple Metal API向けのJava 2Dパイプラインが実装される ● macOS/AArch64 Port ○ Appleシリコン(M1, ARM)搭載のMacに対応する

Slide 41

Slide 41 text

41 Take a Quick Look ● Deprecate the Applet API for Removal ○ Applet APIが非推奨になる ● Strongly Encapsulate JDK Internals ○ モジュールによる完全なカプセル化で、JDKの内部APIへのアクセスができ なくなる(ランタイム例外が発生する) ○ Java 16以降、JVMの起動オプション”--illegal-access”のデフォルト値 が”permit”から”deny”になったが、”permit”も選べた ○ Java 17以降は”deny”一択、relaxed strong encapsulationになった ○ https://www.slideshare.net/tokumasu123/jdk-16-jep-396-jjug-ccc-2021-spring

Slide 42

Slide 42 text

42 Take a Quick Look ● Remove RMI Activation ○ Remote Method Invocation (RMI) 起動メカニズムが削除される ● Remove the Experimental AOT and JIT Compiler ○ 試験的に入っていたAOT・JITコンパイラ(Graal)が削除される ○ Graalコンパイラが欲しい人はGraalVMを使おう ● Deprecate the Security Manager for Removal ○ セキュリティマネージャー(サーバーサイドJavaではあまり使われていな かった)を削除するために非推奨とする

Slide 43

Slide 43 text

43 Take a Quick Look ● Foreign Function & Memory API (Incubator) ○ Javaランタイムの外にあるコードやデータとJavaプログラムが連携するた めのAPIが導入される ● Vector API (Second Incubator) ○ ベクトル計算のためのAPIが導入される ● Context-Specific Deserialization Filters ○ オブジェクトをデシリアライズする際のフィルタ(Java 9で導入)を状況に応じ 選ぶためのAPIが追加される

Slide 44

Slide 44 text

44 Deep Dive to Pattern Matching for Switch (Preview) ● switch式でパターンマッチができる (プレビュー機能だけど) ● if-else地獄が改善できるかもしれない

Slide 45

Slide 45 text

45 ● Java 15からPreviewで入っていた ● sealとは「封印する」「密閉する」とかそんな意味である(漏れない & 他からの侵 入を許さないってことだ) ● クラスやインターフェースに”sealed”キーワードをつけて宣言する ● ”permits”キーワードで継承・実装を許可するサブクラスも指定する ● Recordおよびswitch使ったパターンマッチと組み合わせたデモするよ〜 Deep Dive to Sealed Classes

Slide 46

Slide 46 text

46 You became a Java 17 master! ● これでJava 17を完全にマスターしましたね ● コードを書く上で超ビッグな変更はない気がする※個人の感想 ● でもsealedとかちゃんと書いていこうな! ● JVMの内部APIへのアクセスができなくなる件は要注意案件らしいゾ!

Slide 47

Slide 47 text

おわり。