Slide 1

Slide 1 text

Javaは今どこに向かっているのか 櫻庭 祐一

Slide 2

Slide 2 text

OpenJDK JDK Project Project Amber Java によるデータ指向プログラミング の主要な新機能 Java 17 21 から

Slide 3

Slide 3 text

Java 17 21 から の主要な新機能 OpenJDK JDK Project

Slide 4

Slide 4 text

OpenJDK JDK Project https://openjdk.org/projects/jdk/ のサブプロジェクト JDK Project: OpenJDK JDK 21 2023-09-19 JDK 20 2023-03-21 半年ごとのリリース JDK 他のサブプロジェクトをまとめて を開発 Oracle Java 21 は から 2 年周期 LTS Oracle は などのディストリビュータによる Note: OpenJDK LTS LTS には と非 の区別はない

Slide 5

Slide 5 text

JEP: JDK Enhancement Proposal の機能を規定 JDK 新機能だけでなく、実装改善、機能の削除も含む Preview Standard 正式な機能 の種類 JEP Incubator Experimental プレビュー機能 実験的な機能 新しいモジュール ex. Records ex. HTTP Client ex. ZGC Note: Preview, Experimental, Incubator は最低 2 回

Slide 6

Slide 6 text

JEP: JDK Enhancement Proposal の機能を規定 JDK 新機能だけでなく、実装改善、機能の削除も含む Preview Standard 正式な機能 の種類 JEP Incubator Experimental プレビュー機能 実験的な機能 新しいモジュール ex. Records ex. HTTP Client ex. ZGC Note: Preview, Experimental, Incubator は最低 2 回

Slide 7

Slide 7 text

JEP: JDK Enhancement Proposal Java 18 400: UTF-8 by Default 408: Simple Web Server 413: Code Snippets in Java API Documentation 416: Reimplement Core Re ection with Method Handles 417: Vector API (Third Incubator) 418: Internet-Address Resolution SPI 419: Foreign Function & Memory API (Second Incubator) 420: Pattern Matching for switch (Second Preview) 421: Deprecate Finalization for Removal Java 19 405: Record Patterns (Preview) 422: Linux/RISC-V Port 424: Foreign Function & Memory API (Preview) 425: Virtual Threads (Preview) 426: Vector API (Fourth Incubator) 427: Pattern Matching for switch (Third Preview) 428: Structured Concurrency (Incubator) Java 20 429: Scoped Values (Incubator) 432: Record Patterns (Second Preview) 433: Pattern Matching for switch (Fourth Preview) 434: Foreign Function & Memory API (Second Preview) 436: Virtual Threads (Second Preview) 437: Structured Concurrency (Second Incubator) 438: Vector API (Fifth Incubator) Java 21 430: String Templates (Preview) 431: Sequenced Collections 442: Foreign Function & Memory API (Third Preview) 444: Virtual Threads . . .

Slide 8

Slide 8 text

JEP: JDK Enhancement Proposal Java 18 400: UTF-8 by Default 408: Simple Web Server 413: Code Snippets in Java API Documentation 416: Reimplement Core Re ection with Method Handles 417: Vector API (Third Incubator) 418: Internet-Address Resolution SPI 419: Foreign Function & Memory API (Second Incubator) 420: Pattern Matching for switch (Second Preview) 421: Deprecate Finalization for Removal Java 19 405: Record Patterns (Preview) 422: Linux/RISC-V Port 424: Foreign Function & Memory API (Preview) 425: Virtual Threads (Preview) 426: Vector API (Fourth Incubator) 427: Pattern Matching for switch (Third Preview) 428: Structured Concurrency (Incubator) Java 20 429: Scoped Values (Incubator) 432: Record Patterns (Second Preview) 433: Pattern Matching for switch (Fourth Preview) 434: Foreign Function & Memory API (Second Preview) 436: Virtual Threads (Second Preview) 437: Structured Concurrency (Second Incubator) 438: Vector API (Fifth Incubator) Java 21 430: String Templates (Preview) 431: Sequenced Collections 442: Foreign Function & Memory API (Third Preview) 444: Virtual Threads . . .

Slide 9

Slide 9 text

JEP 400: UTF-8 by default デフォルトファイルエンコーディングを に統一 UTF-8 java.io InputStreamReader, FileReader, OutputStreamWriter, FileWriter, PrintStream java.util Formatter, Scanner java.net URLEncoder, URLDecoder 影響をうけるクラス でデフォルトエンコーディングで を 使用している場合、要注意 Windows Windows-31J -D le.encoding =COMPAT 従来通りのファイルエンコーディングを使用するには 起動オプション

Slide 10

Slide 10 text

JEP 431: Sequenced Collections 最初と最後の要素にアクセスできるインタフェース SequencedCollection SequencedSet SequencedMap

Slide 11

Slide 11 text

JEP 444: Virtual Threads by Project Loom が管理する軽量スレッド JVM 待ち時間を活用することでスループット向上 I/O アプリケーションなど通信を多用するシステムに効果的 Web 使い方は従来の とほぼ同じ Thread への対応 Virtual Treads なども対応予定 Spring Framework Helidon Nima Oracle JDBC Driver

Slide 12

Slide 12 text

Javaによるデータ指向プログラミング Project Amber

Slide 13

Slide 13 text

Project Amber 言語仕様の改良と拡張を行うプロジェクト 286: Local-Variable Type Inference (var) (10) 323: Local-Variable Syntax for Lambda Parameters (11) 361: Switch Expressions (14) 378: Text Blocks (15) 394: Pattern Matching for instanceof (16) 395: Records (16) 409: Sealed Classes (17) 仕様策定完了 仕様策定中 430: String Templates (Preview) 440: Record Patterns 441: Pattern Matching for switch 443: Unnamed Patterns and Variables (Preview) 445: Flexible Main Methods and Anonymous Main Classes (Preview) 447: Statements before super()

Slide 14

Slide 14 text

Project Amber 型 395: Records 409: Sealed Classes 447: Statements before super() 361: Switch Expressions 394: Pattern Matching for instanceof 440: Record Patterns 441: Pattern Matching for switch 443: Unnamed Patterns and Variables (Preview) パターンマッチング 286: Local-Variable Type Inference (var) 323: Local-Variable Syntax for Lambda Parameters 378: Text Blocks 430: String Templates (Preview) 445: Flexible Main Methods and Anonymous Main Classes (Preview) その他

Slide 15

Slide 15 text

Records イミュータブルなデータを表す専用のクラス 例 座標を表すクラス Boilerplate

Slide 16

Slide 16 text

Records イミュータブルなデータを表す専用のクラス 例 座標を表すクラス

Slide 17

Slide 17 text

Records イミュータブルなデータを表す専用のクラス 例 座標を表すクラス クラス nal インタフェースは実装できるが、他のクラスから継承はできない メソッドの追加も可能

Slide 18

Slide 18 text

Sealed Class 継承を制限したクラス 例 図形を表すクラス

Slide 19

Slide 19 text

Sealed Class 継承を制限したクラス 例 図形を表すクラス で定義 sealed permitsでサブクラスを制限 サブクラスは同モジュールもしくは同パッケージ サブクラスは以下のいずれかで定義 nal sealed non-sealed 使用時 switch default句を省略できる

Slide 20

Slide 20 text

Switch Expression 文から switch 式へ switch

Slide 21

Slide 21 text

Switch Expression 文から switch 式へ switch 矢印で記述

Slide 22

Slide 22 text

Switch Expression 文から switch 式へ switch 処理が 1 行であればカッコ省略可

Slide 23

Slide 23 text

Switch Expression 文から switch 式へ switch であればdefault enum, selaed class 句省略可

Slide 24

Slide 24 text

Switch Expression 文から switch 式へ switch 式 値が返せる switch

Slide 25

Slide 25 text

Switch Expression 文から switch 式へ switch 処理をカッコでくくる時は で値を返す yield

Slide 26

Slide 26 text

Pattern Matching パターンマッチング 入力に対し特定のパターンと照合すること 適合した場合、その要素を取りだすこと パターンとして型を使用 JEP 394, 440, 441

Slide 27

Slide 27 text

Pattern Matching

Slide 28

Slide 28 text

Pattern Matching Boilerplate!

Slide 29

Slide 29 text

Pattern Matching

Slide 30

Slide 30 text

Pattern Matching

Slide 31

Slide 31 text

Pattern Matching

Slide 32

Slide 32 text

Data Oriented Programming ドメインモデルの実装では ... データ 業務ルール

Slide 33

Slide 33 text

Data Oriented Programming ドメインモデルの実装では ... データ 業務ルール データ指向プログラミングの原則 #1 は、 コードをデータから切り離すことである “データ指向プログラミング” より引用

Slide 34

Slide 34 text

Data Oriented Programming ドメインモデルの実装では ... データ 業務ルール リソース 値オブジェクト イベント ... ステートレスな処理 型として表現する モジュールとして表現する ( 型として扱う必要はない ) イミュータブルであることが重要

Slide 35

Slide 35 text

映画のチケットで考えてみる 映画のチケットは席の種類と、 チケットの区分によって値段が異なるとする 席はプレミア席と一般席 チケットの区分は一般、学生、シニアの 3 種類

Slide 36

Slide 36 text

映画のチケットで考えてみる 料金を計算する

Slide 37

Slide 37 text

映画のチケットで考えてみる 式で記述 switch

Slide 38

Slide 38 text

映画のチケットで考えてみる のパターンマッチングを利用 Recordのパターンマッチングを利用 Record

Slide 39

Slide 39 text

映画のチケットで考えてみる をさらに分解 Record

Slide 40

Slide 40 text

映画のチケットで考えてみる をさらに分解 Record 式で処理を分けるより switch テンプレートメソッドパターンで記述すればいいのでは? 業務ルールが複数のクラスに分散してしまい、 見通しが悪くなる データ間の関係 ( 関連、コンポジッション ) と 処理間の関係 ( 使用 ) が混在しまい、複雑になりがち 業務ルールは処理によって必要とするデータも変化する

Slide 41

Slide 41 text

DOP OOP 適材適所 : DOP ドメインモデル : OOP バウンダリー バウンダリーのフレームワークに則った記述

Slide 42

Slide 42 text

Conclusion 月リリース予定 Java 21 LTS 9 Virtual Threads などが導入予定 パターンマッチングなどデータ指向プログラミングに向けた機能 Project Amber Java 21 String Templateが パターンマッチングはさらに拡張される予定 で Preview