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

Project Amberで変わる Javaのプログラミングスタイル

Yuichi.Sakuraba
November 18, 2023
600

Project Amberで変わる Javaのプログラミングスタイル

2023.11.18 JavaDo
Java 21 リリース記念イベント@札幌 発表資料

Yuichi.Sakuraba

November 18, 2023
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

  3. OpenJDK JDK Project

    View full-size slide

  4. 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
    には と非 の区別はない

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 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)

    View full-size slide

  8. Project Amber

    View full-size slide

  9. 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)
    仕様策定完了

    View full-size slide

  10. 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

    View full-size slide

  11. 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)
    その他

    View full-size slide

  12. 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)
    その他

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. Switch Expression
    文から
    switch 式へ
    switch

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  25. Pattern Matching

    View full-size slide

  26. Pattern Matching
    Boilerplate!

    View full-size slide

  27. Pattern Matching
    変数に自動的に代入

    View full-size slide

  28. Pattern Matching
    で使用
    switch case

    View full-size slide

  29. Pattern Matching
    を分解
    Record

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  42. 参考文献
    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
    データ指向プログラミングの真実をお話しします

    View full-size slide

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

    View full-size slide