Gymterview
junior

Pattern Matching для switch

Pattern Matching для switch (финализирован в Java 21) позволяет использовать type patterns, guarded patterns и null-обработку в switch. В сочетании с sealed types обеспечивает exhaustive check без default.

Пример: type patterns, guard clauses, null
// Type patterns в switch
static String format(Object obj) {
    return switch (obj) {
        case Integer i  -> "int: " + i;
        case Long l     -> "long: " + l;
        case Double d   -> "double: " + d;
        case String s   -> "string: " + s;
        case null       -> "null";       // обработка null!
        default         -> "unknown: " + obj;
    };
}

// Guarded patterns (when)
static String classify(Shape shape) {
    return switch (shape) {
        case Circle c when c.radius() > 100 -> "Большой круг";
        case Circle c                       -> "Круг r=" + c.radius();
        case Rectangle r when r.width() == r.height() -> "Квадрат";
        case Rectangle r                    -> "Прямоугольник";
        case Triangle t                     -> "Треугольник";
    };
}

// Sealed types — exhaustive без default
sealed interface Result<T> permits Success, Failure {}
record Success<T>(T value) implements Result<T> {}
record Failure<T>(String error) implements Result<T> {}

static <T> String handle(Result<T> result) {
    return switch (result) {
        case Success<T> s -> "OK: " + s.value();
        case Failure<T> f -> "Error: " + f.error();
        // default не нужен — компилятор знает все подтипы
    };
}

Null-обработка в switch

Пример
// До Java 21: switch бросал NPE для null
// Java 21: можно обрабатывать null
static String process(String s) {
    return switch (s) {
        case null          -> "null value";
        case "hello"       -> "greeting";
        case String str when str.length() > 10 -> "long: " + str;
        case String str    -> "other: " + str;
    };
}

Частые ошибки

  • Неправильный порядок patterns — case String s перед case String s when s.length() > 10 делает guarded pattern недостижимым
  • Забыть null case — если null не обработан и нет default, NPE как раньше
  • default с sealed types — скрывает ошибки при добавлении нового подтипа

Как используется в 2026

  • Стандартная практика для обработки разных типов, состояний, событий
  • Sealed + Records + Pattern Matching = визитор без Visitor pattern
  • Активно используется в domain logic и event handling

На собеседовании: покажите пример с sealed types и exhaustive switch — это самый мощный use case. Обязательно упомяните when для guard clauses и возможность обработки null. Частая ошибка — неправильный порядок patterns (более специфичные должны быть выше).