Gymterview
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 (_). Это показывает глубокое понимание, а не поверхностное знание синтаксиса.