◦ 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); } }
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; } }
• さらに進んで:クラスのデコンストラクタができるようになると、 Record と同様にクラスの再構築式もできる。 ◦ 暗黙的に不変であるバリュー・タイプについても、再構成は有用である。 P. 39 if (x instance of Person(String first, String last)) { … }
もし、double を受け取るコンストラクタがある場合: public JsonNumber(double x) { … } • コンストラクタに int を与えられる。 Json j = new JsonNumber(3) • しかし、それを出コンストラクトして int 型を入れ子にできない。 case JsonNumber(int x): case JsonNumber(double x): • さらに悪いことに、手動で double を int にキャストできるが、それは損失が大きい。 • これは「赤いボール」のケースで見たのと同じような非対称性である。 P. 41