Автор оригинала: 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 .