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

Java Language Future

Chihiro Ito
November 22, 2023

Java Language Future

Chihiro Ito

November 22, 2023
Tweet

More Decks by Chihiro Ito

Other Decks in Technology

Transcript

  1. 3 本資料は Oracle 社のJava Language Architect である Brian Goetz 氏が

    Devoxx Belgium で講演 された Java Language Update を同氏の許可を 得て翻訳しています。
  2. 4 本資料について Java Language Update の未来の部分を抜粋 元動画 • 本資料の動画の最初からのリンク •

    本資料の対象範囲からはじまるリンク P. XX もとの資料のページ番号
  3. 5 Reconstruction expressions (作業中) • Record は不変のデータ保持者であり、"getter "を内蔵する • 不変オブジェクトの

    "setter "に相当するものは何か? ◦ setterは、可変オブジェクトに対して「このプロパティを分離して変更」を意味する ◦ 不変オブジェクトに相当するものは、既存のオブジェクトをコピーする。 しかし、指定された要素には異なる値が設定される。 ▪ 「Point p のコピーだが、x 要素はゼロに設定される」 • Record の “wither "のメソッドを書いてもらうこともできる。 • しかし、まずい! ◦ せっかくエラーになりやすい定型文をなくしたのに、また増やすのか? record Point(int x, inty) { Point withX(int newX) { return new Point(newX, y); } Point withY(int newY) { return new Point(x, newY); } } P. 35
  4. 6 Reconstruction expressions (作業中) • 再構築式は、Record の値と、Record の要素を操作する一連の手続きを取り、新しいRecordに評価する。 • これはどういう意味か?

    ◦ Record の各要素は変更可能なローカル変数に変更され、そのロカール変数の終了値がRecordのコン ストラクタに戻されて新しいRecordが生成される。 ◦ これはおおまかに次のようになる。 ◦ 手続きは、代入だけでなく、どんなJavaの手続きでも構わない。 P. 36 Point p = … Point p0 = p with { x = 0; } Point p0 = switch (p) { case Point(var x, var y) -> { x = 0; yield new Point(x,y); } }
  5. 7 Reconstruction expressions (作業中) • Record のメソッドを実装するために再構成式を使用できる。 • 再構成式はネストできる。 P.37

    record Complex(double re, double im) { Complex conjugate() { return this with { im = -im } } } record Point(int x,int y) {} record Circle(Point center, int radius) {} Circle c = aCircle with { center = center with { x = 0; } }
  6. 8 Deconstruction patterns for classes (作業中) • Record は、"Record パターン

    "によってデコンストラクタをサポートする。 ◦ 状態記述から導出できるため、私たちは"無償 "でこれを手に入れられる。 • 任意のクラスでもデコンストラクタ・パターンを得られるのか? ◦ はい。ただし、コンストラクタを逆にしたような「デコンストラクタ」を書く必要がある P. 38 Class Person { final String first, last; … public Person(String first, String last) { this.first = first; this.last = last; } public deconstructor Person(String first, String last) { first = this.first; last = this.last; } }
  7. 9 Deconstruction patterns for classes (作業中) • そうすれば、Recordと同じようにクラスをデコンストラクトできるだろう。 ◦ レコード・パターンはデコンストラクション・パターンの特殊なケースに過ぎない。

    • さらに進んで:クラスのデコンストラクタができるようになると、 Record と同様にクラスの再構築式もできる。 ◦ 暗黙的に不変であるバリュー・タイプについても、再構成は有用である。 P. 39 if (x instance of Person(String first, String last)) { … }
  8. 10 Statements before super() (JEP 447, もうすぐ) • 現在、コンストラクタの委譲 (this(...)

    /super(...)) はコンストラクタの最初の手続きでなければならないとい う制約がある。 ◦ オブジェクトにアクセスする前に、親クラスが初期化されていることを保証するための、 意図的な制限である。 • しかし、これは不必要な制限であり、いくつかの有用な慣習的な使い方を除外している。 ◦ 引数の検証、親クラスのコンストラクタへの計算された引数。 ◦ そこで、コンストラクタの委譲の前例として、this にアクセスしない手続きを許可する。 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value < 0) throw new IllegalArgumentException(value); super(value); } } P. 40
  9. 11 Primitive type patterns (作業中) • タイプ・パターンや switch のプリミティブの非対称性については、まだ改善すべき点がある。 •

    もし、double を受け取るコンストラクタがある場合: public JsonNumber(double x) { … } • コンストラクタに int を与えられる。 Json j = new JsonNumber(3) • しかし、それを出コンストラクトして int 型を入れ子にできない。 case JsonNumber(int x): case JsonNumber(double x): • さらに悪いことに、手動で double を int にキャストできるが、それは損失が大きい。 • これは「赤いボール」のケースで見たのと同じような非対称性である。 P. 41
  10. 12 Primitive type patterns (作業中) • Instanceof とキャストは深い関係にある。 ◦ Instanceof

    は基本的に「この型にキャストしても安全かどうか 」を問うものである。 ◦ 参照型の場合、これはサブタイプ化と一致する。 ◦ プリミティブ型の場合、instanceof は現在のところ未定義である。 • instanceof を「例外なく・精度を落とさずにキャストが成功するか 」という意味に一般化できる ◦ 0 は instanceof byte だが、1000 はそうではない。 • instanceof の定義の拡張にあわせて、プリミティブ型のパターンを定義できる。つまり case JsonNumber(int x): は普通のパターン合成に過ぎないのか、それともターゲットがJsonNumberで、その double の要素は int に損なわれることなく収まる値を含んでいるのか • また、float/double/boolean定数のケース・ラベルもサポートしている。 P. 42
  11. 13