Рубрики
Без рубрики

Сопоставление шаблонов для instanceof в Java 14

Узнайте о сопоставлении шаблонов с instanceof в Java 14.

Автор оригинала: Jonathan Cook.

1. Обзор

В этом кратком руководстве мы продолжим нашу серию на Java 14 , взглянув на Сопоставление шаблонов для экземпляра , который является еще одной новой функцией предварительного просмотра, включенной в эту версию JDK.

Вкратце, JEP 305 цель состоит в том, чтобы сделать условное извлечение компонентов из объектов намного проще, лаконичнее, читабельнее и безопаснее.

2. Традиционный оператор instanceOf

В какой-то момент мы, вероятно, все написали или видели код, который включает в себя некоторую условную логику, чтобы проверить, имеет ли объект определенный тип. Обычно мы можем сделать это с помощью оператора instanceof , за которым следует cast . Это позволяет нам извлечь нашу переменную перед применением дальнейшей обработки, специфичной для этого типа.

Давайте представим, что мы хотим проверить тип в простой иерархии объектов животных:

if (animal instanceof Cat) {
    Cat cat = (Cat) animal;
    cat.meow();
   // other cat operations
} else if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.woof();
    // other dog operations
}

// More conditional statements for different animals

В этом примере для каждого условного блока мы тестируем параметр animal, чтобы определить его тип, преобразуем его с помощью приведения и объявляем локальную переменную. Затем мы можем выполнять операции, специфичные для данного конкретного животного.

Хотя этот подход работает, он имеет несколько недостатков:

  • Это утомительно писать такой тип кода, где нам нужно протестировать тип и сделать приведение для каждого условного блока
  • Мы повторяем имя типа три раза для каждого блока if
  • Читабельность плохая, так как в коде доминируют литье и извлечение переменных
  • Повторное объявление имени типа означает, что существует большая вероятность появления ошибки . Это может привести к неожиданной ошибке во время выполнения
  • Проблема усиливается каждый раз, когда мы добавляем новое животное

В следующем разделе мы рассмотрим, какие усовершенствования предоставляет Java 14 для устранения этих недостатков.

3. Enhanced instanceOf в Java 14

Java 14, через JEP 305, приносит улучшенную версию оператора instanceof , который одновременно тестирует параметр и присваивает его переменной привязки соответствующего типа.

Это означает, что мы можем написать наш предыдущий пример животного в гораздо более сжатом виде :

if (animal instanceof Cat cat) {
    cat.meow();
} else if(animal instanceof Dog dog) {
    dog.woof();
}

Давайте разберемся, что здесь происходит. В первом блоке if мы сопоставляем animal с шаблоном типа Cat cat . Сначала мы тестируем переменную animal , чтобы увидеть, является ли она экземпляром Cat . Если это так, то он будет приведен к нашему типу Cat , и, наконец, мы назначим результат cat .

Важно отметить, что имя переменной кошка это не существующая переменная, а объявление переменной шаблона.

Следует также отметить, что переменные cat и dog находятся только в области видимости и назначаются, когда соответствующие выражения соответствия шаблону возвращают true . Следовательно, если мы попытаемся использовать любую переменную в другом месте, код будет генерировать ошибки компилятора.

Как мы видим, эта версия кода гораздо проще для понимания. Мы упростили код, чтобы значительно уменьшить общее количество явных приведений, и читабельность значительно улучшилась.

Более того, этот тип тестового шаблона может быть особенно полезен при написании равенство методы.

4. Заключение

В этом коротком уроке мы рассмотрели Сопоставление шаблонов с instanceof в Java 14. Использование этого нового встроенного улучшения языка помогает нам писать лучший и более читаемый код, что, как правило, хорошо.

Как всегда, полный исходный код статьи доступен на GitHub .