Паттерн-матчинг (сопоставление с образцом) является довольно популярной синтаксической конструкцией, которая есть практически во всех функциональных языках. За годы их существования эта конструкция уже настолько доказала свою пользу и необходимость, что начала проникать и в известные императивные языки. И теперь очередь дошла и до Java: паттерн-матчинг получил свой JEP и был включён в проект Amber, где ведётся исследование и разработка будущих языковых улучшений. Помимо паттерн-матчинга там также есть локальный вывод типов (var
), data-классы, подчёркивания, улучшенные перечисления, перекрытия лямбда-параметров и т.д.
Смысл паттерн-матчинга заключается в объединении проверки типа и извлечения из структуры необходимых компонентов. Сейчас такое делается с помощью оператора instanceof
и последующего приведения:
if (value instanceof Integer) { int i = (Integer) value; System.out.println("int %d", i); }
Такая конструкция является довольно громоздкой и чреватой ошибками. Паттерн-матчинг решает эту проблему с помощью нового оператора matches
:
if (value matches Integer i) { System.out.println("int %d", i); }
Кроме того, паттерн-матчинг можно будет сделать с помощью улучшенного оператора switch
:
switch (value) { case Integer i: System.out.println("int %d", i); break; ... }
Также в будущем планируется развить идею паттерн-матчинга ещё больше и добавить матчинг с деструктуризацией, а также позволить оператору switch
возвращать значение:
double area = switch (shape) { case Circle(var center, var radius) -> PI * radius * radius; case Square(var lowerLeft, var edge) -> edge * edge; case Rect(var lowerLeft, var upperRight) -> (upperRight.x - lowerLeft.x) * (upperRight.y - lowerLeft.y); ... };
При всей своей привлекательности введение паттерн-матчинга порождает ряд вопросов, которые на данный момент ожидают ответа:
- Области видимости
- Перекрытие переменными паттерна других переменных
- Матчинг
null
- Матчинг примитивных типов
- Матчинг generic-типов
Некоторые из этих вопросов кажутся действительно сложными, и это вызывает некое опасение, что паттерн-матчинг в Java может быть отложен на неопределённое время или полностью отвергнут, как это произошло с Enhanced Enums. Однако мы будем надеяться, что этого не произойдёт, и разработчики языка смогут решить вышеописанные проблемы.