Slide 1

Slide 1 text

Project Amberで変わる Javaのプログラミングスタイル 櫻庭 祐一 Java in the Box

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

OpenJDK JDK Project

Slide 4

Slide 4 text

OpenJDK JDK Project https://openjdk.org/projects/jdk/ のサブプロジェクト JDK Project: OpenJDK 他のサブプロジェクトをまとめて を開発 JDK JDK 22 2024-03-19 JDK 21 2023-09-19 半年ごとのリリース 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 21 430: String Templates (Preview) 431: Sequenced Collections 439: Generational ZGC 440: Record Patterns 441: Pattern Matching for switch 442: Foreign Function & Memory API (Third Preview) 443: Unnamed Patterns and Variables (Preview) 444: Virtual Threads 445: Unnamed Classes and Instance Main Methods (Preview) 446: Scoped Values (Preview) 448: Vector API (Sixth Incubator) 449: Deprecate the Windows 32-bit x86 Port for Removal 451: Prepare to Disallow the Dynamic Loading of Agents 452: Key Encapsulation Mechanism API 453: Structured Concurrency (Preview)

Slide 8

Slide 8 text

Project Amber

Slide 9

Slide 9 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) 440: Record Patterns (21) 441: Pattern Matching for switch (21) 仕様策定完了

Slide 10

Slide 10 text

Project Amber 言語仕様の改良と拡張を行うプロジェクト 仕様策定中 447: Statements before super() 455: Primitive types in Patterns, instanceof, and switch 456: Unnamed Variables & Patterns 459: String Templates 463: Implicitly Declared Classes and Instance Main Methods

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Records イミュータブルなデータを表すデータ専用クラス 例 座標を表すクラス クラス nal インタフェースは実装可 他のクラスから継承は不可 メソッドの追加も可能 どこに使う イベント ... 値オブジェクト

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Switch Expression 文から switch 式へ switch

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Pattern Matching

Slide 26

Slide 26 text

Pattern Matching Boilerplate!

Slide 27

Slide 27 text

Pattern Matching 変数に自動的に代入

Slide 28

Slide 28 text

Pattern Matching で使用 switch case

Slide 29

Slide 29 text

Pattern Matching を分解 Record

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Data Oriented Programming データを(イミュータブルな)データとして表す 代数的データ型を用いたデータモデリング ビジネスロジックをデータと切り離す

Slide 32

Slide 32 text

Data Oriented Programming データを(イミュータブルな)データとして表す 代数的データ型を用いたデータモデリング ビジネスロジックをデータと切り離す データ ビジネスロジック リソース 値オブジェクト イベント ... ステートレスな処理 型として表現する モジュールとして表現する ( 型として扱う必要はない ) イミュータブルであることが重要

Slide 33

Slide 33 text

Data Oriented Programming Boundary Controller Entity Boundary 他システム ブラウザ 他システム インタフェース クラスベースの モデリング ドメインモデル ビジネスロジック DOP

Slide 34

Slide 34 text

Algebraic Data Type, ADT 代数的データ型 直積型 直和型 複数のデータをまとめる型 構造体 Record 複数のデータの となる型 OR 列挙型 Sealed Class

Slide 35

Slide 35 text

直和型における処理の振り分け 従来 Template Pattern Visitor Pattern 処理がコード中に分散 処理に必要な条件/データが多いと依存関係が複雑化 DOP Pattern Matching 処理がまとまる 条件/データは処理モジュールのみに依存

Slide 36

Slide 36 text

直和型における処理の振り分け 例 商品の購入価格 価格 = 商品単価 × 割引率 × 個数 誰が買うかで異なる 非会員/会員 キャンペーン 特売などで変動 個数が多いと 割引 Template Patternで書きますか?

Slide 37

Slide 37 text

単純化して顧客の違いだけで商品の価格を計算する 顧客は非会員と会員 従来の記述 実装の内部が ビジネスロジックに 入り込んでしまう

Slide 38

Slide 38 text

単純化して顧客の違いだけで商品の価格を計算する 顧客は非会員と会員 会員かどうかを 型として表す パターンマッチングで 処理を分ける

Slide 39

Slide 39 text

単純化して顧客の違いだけで商品の価格を計算する 顧客は非会員と会員 会員かどうかを 型として表す

Slide 40

Slide 40 text

JEP 459: String Templates (2nd Preview) 文字列に 変数 / 式 を埋め込み 文字列補間を行う言語仕様 “Hello, ” + name + “!”; STR.”Hello, \{name}!” 容易なカスタム化 ログメッセージなどを文字列から生成 JSON, SQL,

Slide 41

Slide 41 text

Conclusion Java 21 LTS Virtual Threads などが導入 データ指向プログラミングに向けた機能 Project Amber Java 21 String Templateが では Preview データを型で表す ビジネスロジックと切り離して考える データ指向プログラミング

Slide 42

Slide 42 text

参考文献 InfoQ: Data Oriented Programming in Java https://www.infoq.com/articles/data-oriented-programming-java/ JavaOne 2022: Data Oriented Programming in Java https://youtu.be/UQAw3pvZPCY?si=5SiP6O0o8i6EWsyi https://slides.com/kawasima/truth-of-data-oriented-programming データ指向プログラミングの真実をお話しします

Slide 43

Slide 43 text

Project Amberで変わる Javaのプログラミングスタイル 櫻庭 祐一 Java in the Box