4.15. レコードパターン (プレビュー)
Red Hat build of OpenJDK 21 では、レコードパターンが導入されています。これは、レコード値を分解するために Java プログラミング言語を強化するプレビュー機能です。この機能により、instanceof
Operator を使用する変数の宣言と割り当てが可能になります。
属性 x
と y
を持つ Point
という名前のレコードの次の宣言を考えてみましょう。
record Point(int x, int y) {}
record Point(int x, int y) {}
前述の宣言に基づいて、次のコードは値が Point
のインスタンスであるかどうかをテストし、値から x
および y
コンポーネントを直接抽出することもできます。
if (obj instanceof Point(int x, int y)) { System.out.println(x+y); }
if (obj instanceof Point(int x, int y)) {
System.out.println(x+y);
}
この機能は、他のレコード内にネストされたレコードでも使用できます。たとえば、属性が Point
レコードと Color
列挙型の ColoredPoint
レコードの属性を持つ、Rectangle
という名前のレコードに対する以下の宣言を考えてみます。
record Point(int x, int y) {} enum Color { RED, GREEN, BLUE } record ColoredPoint(Point p, Color c) {} record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
前述の宣言に基づいて、次のコードは値が Rectangle
のインスタンスであるかどうかをテストし、左上の点から色を抽出できます。
if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) { System.out.println(ul.attribute()); }
if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
System.out.println(ul.attribute());
}
詳細は、JEP 440: Record Patterns を参照してください。