junior
Pattern Matching для instanceof
Pattern Matching для instanceof (финализирован в Java 16) устраняет необходимость явного приведения типа после проверки instanceof — переменная привязывается к типу прямо в условии.
Пример
// До Java 16 — проверка + приведение:
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase());
}
// Java 16+ — pattern variable:
if (obj instanceof String s) {
System.out.println(s.toUpperCase()); // s уже String
}
// С условием (guarded pattern):
if (obj instanceof String s && s.length() > 5) {
System.out.println("Long string: " + s);
}
Практическое применение — equals()
Пример
// До Java 16:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Point)) return false;
Point other = (Point) o;
return x == other.x && y == other.y;
}
// Java 16+:
@Override
public boolean equals(Object o) {
return (o instanceof Point other)
&& x == other.x && y == other.y;
}
Частые ошибки
- Pattern variable с
||—if (obj instanceof String s || obj instanceof Integer s)приводит к ошибке компиляции - Shadowing — если есть поле
s, pattern variablesвызовет ошибку; используйте другое имя - Использовать pattern matching в
catch— не поддерживается
Как используется в 2026
- Стандартная практика; старый стиль с явным cast считается устаревшим
- Комбинируется с Pattern Matching для switch (Java 21) для мощной деконструкции типов
- IDE автоматически предлагает рефакторинг старого кода
На собеседовании: покажите рефакторинг
equals()с pattern matching — это убедительный практический пример. Важно знать про flow scoping (переменная доступна только в scope, где instanceof гарантированно true) и ограничение с||.