Gymterview
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 variable s вызовет ошибку; используйте другое имя
  • Использовать pattern matching в catch — не поддерживается

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

  • Стандартная практика; старый стиль с явным cast считается устаревшим
  • Комбинируется с Pattern Matching для switch (Java 21) для мощной деконструкции типов
  • IDE автоматически предлагает рефакторинг старого кода

На собеседовании: покажите рефакторинг equals() с pattern matching — это убедительный практический пример. Важно знать про flow scoping (переменная доступна только в scope, где instanceof гарантированно true) и ограничение с ||.