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

JEP 359: Records が素敵 / Java Do #17

JEP 359: Records が素敵 / Java Do #17

「JEP 359: Records が素敵」

〈2/9@札幌〉Javaと開発運用&フリーテーマで勉強会
https://javado.connpass.com/event/164021/

Hiroto YAMAKAWA

February 09, 2020
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Technology

Transcript

  1. ハッシュタグ:#JavaDo 公立千歳科学技術大学 情報システム工学科 専任講師
 R&D: Experimental Development of ICT Systems(ex: City-Bus

    Tacking System) 
 Computer in Education, Programming and Programmer's Learning 
 
 Communities: YAMAKAWA, Hiroto : @gishi_yama 2
  2. ハッシュタグ:#JavaDo Javaの文法改善を目的としたProject Amberの1つ
 2021年3月リリース予定の JDK 14 からプレビュー版が導入され、
 (うまくいけば)その後のバージョンリリースで利用できるようになる 
 JEP

    359: Records 5 
 データを保持する( or 運ぶ)ためだけの特別なクラス(データクラス, データキャリアクラス) 
 の作り方を提供する
   ⇒ クラスの書き方の簡略化ではない
   ⇒ 定数の書き方に enum が提供されたように、
     データクラス、データキャリアクラスの 「他のクラスと同じ書き方でしか作れない」 を改善
   ⇒ Scalaの case, Kotlinの data, C#の record を意識している
 何を改善するのか?
  3. ハッシュタグ:#JavaDo • フィールドに(不変な)値を渡せる • フィールドの値を取り出せる • フィールドの値を確認できる • 等値性を確認できる 


    以上のことしかしないクラス 用途の例:
  (複数の値の)戻り値,
  (複数の値の)パラメーター, 
  範囲などのルールがあるデータ, 
 Data Transfer Object, ... Data Class / Data Career Class とは? 6 public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } public int x() { return x; } public int y() { return y; } @Override public String toString() { /* x,y Λදࣔ */ } @Override public boolean equals(Object o) { /* o ͷ x,y ͱൺֱ */ } @Override public int hashCode() { /* x,yͷϋογϡ஋Λੜ੒ */ } } どんなクラス? 例えば...
  4. ハッシュタグ:#JavaDo JEP 359: Records で record 型が作れるようになる 7 public class

    Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } public int x() { return x; } public int y() { return y; } @Override public String toString() { /* x,y Λදࣔ */ } @Override public boolean equals(Object o) { /* o ͷ x,y ͱൺֱ */ } @Override public int hashCode() { /* x,yͷϋογϡ஋Λੜ੒ */ } } ⇒ record Point (int x, int y) {};
  5. ハッシュタグ:#JavaDo Demo 8 record型で、 name, age を持ったデータクラス
 (Person)を宣言
 注) name,

    age の様なフィールド設定のための引数を
    レコードコンポーネント と言います 標準入力で name, age の値を取得 Personをインスタンス化 entries の要素のPersonインスタンスと同値比較し
 まだ同じ値の要素が存在しなければ追加 Personインスタンスの age の値で昇順ソートして
 フィールドの値を確認(表示)
  6. ハッシュタグ:#JavaDo • レコードコンポーネントのルール(コード)を定義できる • 別のコンストラクタを定義できる • インスタンスメソッド、インスタンス初期化子を定義できる • クラスメソッド、クラスフィールド、static初期化子は定義できる
 


    
 
 一部は JDK 14でPreview ReleaseされるRecordsが素敵なのでJShellで試そう で試しています
 https://qiita.com/gishi_yama/items/271f60cb7bb35f59009a 使い方の幅 9 引用: https://openjdk.java.net/jeps/359
  7. ハッシュタグ:#JavaDo • JEP 359: Records (Preview)
 https://openjdk.java.net/jeps/359 • Javaのデータクラス、Brian Goetz氏がInfoQに語る


    https://www.infoq.com/jp/news/2018/03/data-classes-for-java/ • Data Classes and Sealed Types for Java
 https://cr.openjdk.java.net/~briangoetz/amber/datum.html • 参考資料 11