В недавно вышедшем JEP 375 появилась информация о введении в язык так называемых паттернов деконструкции. Такие паттерны позволят применять оператор instanceof
не просто для теста по типу, но и для извлечения компонентов этого типа. В первой реализации можно будет извлекать только компоненты записей:
record Point (int x, int y) {} if (obj instanceof Point(var a, var b)) { System.out.println(a + b); }
В примере выше сначала проверяется, является ли obj
объектом типа Point
, а затем происходит "привязка" новых переменных a
и b
типа int
к полям Point.x
и Point.y
соответственно. Использование ключевого слово var
в паттерне является обязательным: чтобы нельзя было перепутать привязки переменных с константами с тем же именем, которые случайно могут оказаться в той же области видимости (хотя константы пока что не могут использоваться в паттернах, однако в будущем это может измениться).
Код выше семантически эквивалентен следующему более громоздкому коду:
if (obj instanceof Point) { var a = ((Point) obj).x; var b = ((Point) obj).y; System.out.println(a + b); }
Как видно, новый подход является более компактным, декларативным и более типобезопасным.
Новый паттерн-матчинг также будет поддерживать вложенные паттерны:
record Circle(Point origin, int radius) {} if (obj instanceof Circle(Point(var a, var b), var r)) { System.out.println("Circle centered at (" + a + ", " + b + ")"); System.out.println("Area is: " + Math.PI*r*r); }
Во вложенных паттернах весь матчинг будет являться успешным только в том случае, если все его компоненты прошли соответственные тесты типа.
На текущий момент неизвестно, успеют ли деконструкционные паттерны попасть в Java 15 (но с большой вероятностью это будет так).