middle
Record Patterns (деконструкция записей)
Record Patterns (финализированы в Java 21) позволяют деконструировать (разложить) Record на компоненты прямо в pattern matching, включая вложенную деконструкцию.
Пример: деконструкция в instanceof и switch
record Point(int x, int y) {}
record Circle(Point center, double radius) {}
// instanceof с деконструкцией
if (obj instanceof Point(int x, int y)) {
System.out.println("x=" + x + ", y=" + y);
}
// Вложенная деконструкция
if (shape instanceof Circle(Point(var x, var y), var r)) {
System.out.println("Circle at (" + x + ", " + y + ") with radius " + r);
}
// В switch
static String describe(Shape shape) {
return switch (shape) {
case Circle(Point(var x, var y), var r) when r > 10 ->
"Большой круг в (%d, %d)".formatted(x, y);
case Circle(Point(var x, var y), var r) ->
"Круг в (%d, %d) r=%.1f".formatted(x, y, r);
case Rectangle(Point(var x, var y), var w, var h) ->
"Прямоугольник в (%d, %d) %dx%d".formatted(x, y, w, h);
};
}
// Unnamed patterns (Java 21) — игнорирование ненужных компонентов
if (obj instanceof Point(var x, _)) {
// Нужен только x, y игнорируется
}
Частые ошибки
- Деконструировать не-Record — Record Patterns работают только с Records
- Забыть, что деконструкция создаёт копии — значения копируются, а не ссылаются на оригинал
Как используется в 2026
- В связке с Sealed Interfaces + Records — элегантный pattern matching без instanceof-каскадов
- Заменяет Visitor pattern для обработки иерархий типов
На собеседовании: продемонстрируйте вложенную деконструкцию (Record внутри Record) и unnamed patterns (
_). Это показывает глубокое понимание, а не поверхностное знание синтаксиса.