В Java появятся паттерны деконструкции

В недавно вышедшем 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 (но с большой вероятностью это будет так).

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2020