Pattern matching
Тема дорожной карты · Java
Pattern Matching в Java — это современная языковая функция, расширяющая выразительность проверок типов и деструктуризации данных, позволяющая JVM объединить проверку типа, приведение и связывающую переменную в единую лаконичную конструкцию без шаблонного кода. Введённый в предварительный просмотр в Java 14 и финализированный в Java 16, Pattern Matching для instanceof позволяет писать if (obj instanceof String s) вместо классической проверки instanceof с последующим явным приведением, устраняя распространённый источник ClassCastException. Java 21 значительно расширил Pattern Matching для охвата switch-выражений и операторов, обеспечивая исчерпывающую деструктуризацию иерархий sealed class с охраняемыми паттернами (case Circle c when c.radius() > 0) и record patterns (case Point(int x, int y)). Pattern Matching в Java синергетически работает с Sealed Classes (обеспечивающими гарантии исчерпывающести), Records (обеспечивающими прозрачную деструктуризацию) и системой типов JVM для создания более безопасного, более читаемого кода диспетчеризации домена, заменяющего сложные цепочки if-else или паттерны посетителей. Pattern Matching — краеугольный камень современных Java-функций и всё шире используется в диспетчеризации прикладного уровня Spring, обработке доменных событий и конвейерах десериализации JSON/XML на JDK.
Как это работает
Pattern matching — это Java 17/21 LTS с фичами, меняющими, как пишется код: records (immutable data), sealed-типы (закрытая иерархия), pattern matching для switch (21+), текстовые блоки, var, switch-выражения, records как pattern-deconstructed типы. Virtual threads (21) драматически упрощают concurrent server-код. Reactive-программирование (Project Reactor, RxJava) ещё актуально, но virtual threads сужают его нишу.
Когда применять
Таргет 21 LTS для новых проектов — одни virtual threads стоят апгрейда. Records — для DTO, sealed-типы — для конечных иерархий, pattern matching — при диспетчеризации по типу. Миграция с reactive (Project Reactor) на virtual threads — где читаемость бьёт async-stream-преимущества. GraalVM native image — когда важны быстрый старт + низкая память (CLI-тулзы, serverless).
Типичные ошибки
Ловушки Pattern matching: блокировка на virtual thread внутри synchronized-блока (пиннит carrier — теряет смысл); чрезмерное использование records для mutable-концептов (поля records — final); баги reflection в GraalVM native image (требуют файлы конфигурации); расчёт, что cancellation Reactor идентичен interruption virtual thread (разная семантика).