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 недостижимым - Забыть
nullcase — если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 (более специфичные должны быть выше).