{ case NURSERY: case CORPORATION: destination = new Destination(nurseryAddress); break; case ANOTHER: destination = new Destination(anotherAddress); break; default: throw new UnsupportedOperationException("未サポートの届け先種類 ") } Switch 式【Before】 Enum(destinationType)の値によって、destination に代入する値を変える。
{ case NURSERY: case CORPORATION: destination = new Destination(nurseryAddress); break; case ANOTHER: destination = new Destination(anotherAddress); break; default: throw new UnsupportedOperationException("未サポートの届け先種類 ") } Switch 式【Before】 switch 内で代入するために、直前で宣言している
{ case NURSERY: case CORPORATION: destination = new Destination(nurseryAddress); break; case ANOTHER: destination = new Destination(anotherAddress); break; default: throw new UnsupportedOperationException("未サポートの届け先種類 ") } Switch 式【Before】 条件ごとに case の行を定義しないといけない
{ case NURSERY: case CORPORATION: destination = new Destination(nurseryAddress); break; case ANOTHER: destination = new Destination(anotherAddress); break; default: throw new UnsupportedOperationException("未サポートの届け先種類 ") } Switch 式【Before】 case ごとに break 文の記載
(destinationType) { case NURSERY, CORPORATION -> new Destination(nurseryAddress); case ANOTHER -> new Destination(anotherAddress); default -> throw new UnsupportedOperationException("未サポートの届け先種類 "); }; Switch 式【After】
(destinationType) { case NURSERY, CORPORATION -> new Destination(nurseryAddress); case ANOTHER -> new Destination(anotherAddress); default -> throw new UnsupportedOperationException("未サポートの届け先種類 "); }; Switch 式【After】 宣言時に値を設定できるので、 場合によっては final 付加してイミュータブルにできる
(destinationType) { case NURSERY, CORPORATION -> new Destination(nurseryAddress); case ANOTHER -> new Destination(anotherAddress); default -> throw new UnsupportedOperationException("未サポートの届け先種類 "); }; Switch 式【After】 case も1行にまとめられる
(destinationType) { case NURSERY, CORPORATION -> new Destination(nurseryAddress); case ANOTHER -> new Destination(anotherAddress); default -> throw new UnsupportedOperationException("未サポートの届け先種類 "); }; Switch 式【After】 冗長な break 文が排除できた
(destinationType) { case NURSERY, CORPORATION -> new Destination(nurseryAddress); case ANOTHER -> new Destination(anotherAddress); default -> throw new UnsupportedOperationException("未サポートの届け先種類 "); }; Switch 式【After】 参考までに、Arrow labels ではなく、yield も登場 cf.https://openjdk.org/jeps/354#Yielding-a-value (適材適所が前提ですが、個人的には、Arrow labels 使いがちです)
Point { private final int x; private final int y; Point(int x, int y) { this.x = x; this.y = y; } int x() { return x; } int y() { return y; } public boolean equals(Object o) { if (!(o instanceof Point)) return false; Point other = (Point) o; return other.x == x && other.y == y; } public int hashCode() { return Objects.hash(x, y); } public String toString() { return String.format("Point[x=%d, y=%d]", x, y); } } record Point(int x, int y) { } 少ない記述量でイミュータブルなクラスがで きる。 ※参照のアクセサメソッドは"get"始まりで はない
395) record Rational(int num, int denom) { public Rational { int gcd = gcd(num, denom); num /= gcd; denom /= gcd; } private int gcd(int i, int j) { 最大公約数を求める } ... 続く
denom) { public Rational { int gcd = gcd(num, denom); num /= gcd; denom /= gcd; } private int gcd(int i, int j) { 最大公約数を求める } ... 続く Records - 例:分数(from JEP 395) コンストラクタを上書き。 入力値をそのままではなく、通分して生成する。 これで、分数としてのルール(=ドメイン知識)を保てる。