Upgrade to Pro — share decks privately, control downloads, hide ads and more …

みんな大好きJava 8から9月リリースJava 17まで!最近のJava事情あれこれ / Java catch up from 8 to 17

みんな大好きJava 8から9月リリースJava 17まで!最近のJava事情あれこれ / Java catch up from 8 to 17

2021.06.19 GTUGGirlsさんと合同企画 !KotlinとJava基本のき!

Java女子部

June 19, 2021
Tweet

More Decks by Java女子部

Other Decks in Programming

Transcript

  1. Speakers まーや(@maaya8585) • プリセールス • Java/Python/Azure • 最近気になるのはHL7 FHIR mii(@miitan_m1004)

    • サーバサイドエンジニ ア • Java 8 • そろそろバージョン アップしたい よこな(@ihcomega) • デベロッパーアドボケ イト • (元)Scala/Ruby • インフラ方面を学ばな いと
  2. • 言語思想: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. 開発時に必要なキット
  3. 7 JVM brothers Android Java Kotlin Scala Groovy Clojure Headware

    Windows OS Mac OS Linux OS Windows JVM Mac JVM Linux JVM etc….
  4. 8 Java specification Java Community Process OpenJDK (実装OSSグループ) Oracle (商標持ち)

    • 仕様リクエスト(JSR)を元に仕様 策定・改定 • リリース承認(TCK etc.) etc. • メインスポンサー • OpenJDKへバイナリ無償提供 etc. • 開発・実装 • スケジューリング • (バイナリなし) etc. JCPmemberは個人でも 企業/団体でも登録するこ とができるよ JSR: Java Specification Request
  5. 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
  6. 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
  7. 12 Version Java X 機能リスト • Xxxxx • Xxxx •

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

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

    xxxxx OpenJDK JCP あーでもない こーでもない 2年目安に やってこー! はっ! 予定過ぎてた!! リリースしようぜ Java 8 までのリリース管理
  10. 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 までのリリース管理
  11. 16 Version Java 9 以降のリリース管理 JEP xxxx OpenJDK JCP あーでもない

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

    OpenJDK JCP あーでもない こーでもない JEP xxxx JEP xxxx JSR xxxx JSR xxxx JEP: JDK Enhancement Proposals
  13. 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
  14. 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
  15. 21 Java is still free. https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit#heading=h.p3qt2oh5eczi • 基本的な有償無償の区別方法は変化なし ◦ OSS版は無償。ただしEoL期限が変更になった

    ◦ サポートが必要であれば有償ライセンスを各企業から購入 ◦ リリースサイクルが変わっただけ 同じタイミングでOracle OpenJDKのライセンス体 系変更&Oracle OpenJDK固有機能のOSS譲渡 が行われたので混乱を招いた
  16. 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譲渡 が行われたので混乱を招いた
  17. 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 レコード、パターンマッチング バージョンアップで増えたり減ったり󰝋
  18. 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
  19. ローカル変数がvarで宣言できるようになったよ🎉(Java10) 26 Local-Variable Type Inference JEP 286: Local-Variable Type Inference

    http:/ /openjdk.java.net/jeps/286 ローカル変数の宣言で型名の代わりに varが使えるようになりました! 型名を省略してすっきり書けるよ! クラスのフィールドは対象外です。
  20. 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 -> "普通"; });
  21. 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で値を返すよ!
  22. 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メソッドが自動で作られるので、 イミュータブル(不変)なデータクラスが簡単に実装できるよ!
  23. 型の判定とキャストがまとめてできるようになったよ🎉(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式などでもパターンマッチングが使えるようになる!(はず)
  24. 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 レコード、パターンマッチング 🏅最新バージョンに追いつきました!やったね🏅
  25. 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へ)
  26. • 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
  27. 38 Difference of Preview and Incubator • Preview (JEP 12〜)

    ◦ 仕様が決まり実装もされているが一時的に入れられている機能 ◦ 実際使った後のフィードバックを受けた後、将来のJavaに入る ◦ 起動時に--enable-previewというオプションをつけると有効になる • Incubator ◦ モジュール“jdk.incubator”で分離されて試験的に導入される機能 • Experimental ◦ VMレベルの未完成・不安定だが試験的に導入される機能
  28. • 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
  29. 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に対応する
  30. 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
  31. 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ではあまり使われていな かった)を削除するために非推奨とする
  32. 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が追加される
  33. 44 Deep Dive to Pattern Matching for Switch (Preview) •

    switch式でパターンマッチができる (プレビュー機能だけど) • if-else地獄が改善できるかもしれない
  34. 45 • Java 15からPreviewで入っていた • sealとは「封印する」「密閉する」とかそんな意味である(漏れない & 他からの侵 入を許さないってことだ) •

    クラスやインターフェースに”sealed”キーワードをつけて宣言する • ”permits”キーワードで継承・実装を許可するサブクラスも指定する • Recordおよびswitch使ったパターンマッチと組み合わせたデモするよ〜 Deep Dive to Sealed Classes
  35. 46 You became a Java 17 master! • これでJava 17を完全にマスターしましたね

    • コードを書く上で超ビッグな変更はない気がする※個人の感想 • でもsealedとかちゃんと書いていこうな! • JVMの内部APIへのアクセスができなくなる件は要注意案件らしいゾ!