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