1. Обзор
В этом кратком руководстве мы продолжим нашу серию статей о Java 14 , взглянув на сопоставление шаблонов для instanceof,
которое является еще одной новой функцией предварительного просмотра, включенной в эту версию JDK.
Таким образом, JEP 305 направлен на то, чтобы сделать условное извлечение компонентов из объектов намного проще, лаконичнее, читабельнее и безопаснее.
2. Традиционный оператор instanceOf
В какой-то момент мы, вероятно, все писали или видели код, который включает некоторую условную логику для проверки того, имеет ли объект определенный тип. Как правило, мы можем сделать это с помощью оператора instanceof
, за которым следует приведение . Это позволяет нам извлечь нашу переменную, прежде чем применять дальнейшую обработку, специфичную для этого типа.
Давайте представим, что мы хотим проверить тип в простой иерархии животных объектов:
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
В этом примере для каждого условного блока мы тестируем параметр животного, чтобы определить его тип, преобразовываем его с помощью приведения и объявляем локальную переменную. Затем мы можем выполнять операции, специфичные для этого конкретного животного.
Хотя этот подход работает, он имеет несколько недостатков:
- Утомительно писать этот тип кода, где нам нужно проверить тип и сделать приведение для каждого условного блока.
- Мы повторяем имя типа три раза для каждого блока
if
- Читабельность плохая, так как в коде преобладают приведение типов и извлечение переменных.
- Повторное объявление имени типа означает большую вероятность появления ошибки . Это может привести к неожиданной ошибке во время выполнения
- Проблема усугубляется каждый раз, когда мы добавляем новое животное.
В следующем разделе мы рассмотрим, какие улучшения предоставляет Java 14 для устранения этих недостатков.
3. Расширенный instanceOf
в Java 14
Java 14 через JEP 305 предоставляет улучшенную версию оператора instanceof
, который одновременно проверяет параметр и присваивает его переменной привязки соответствующего типа.
Это означает, что мы можем написать наш предыдущий пример с животными гораздо более лаконичным образом :
if (animal instanceof Cat cat) {
cat.meow();
} else if(animal instanceof Dog dog) {
dog.woof();
}
Давайте разбираться, что здесь происходит. В первом блоке if
мы сопоставляем животное
с шаблоном типа Cat cat
. Во-первых, мы проверяем переменную animal
, чтобы увидеть, является ли она экземпляром Cat
. Если это так, он будет приведен к нашему типу Cat
, и, наконец, мы присвоим результат cat
.
Важно отметить, что имя переменной cat
не является существующей переменной, а является объявлением переменной шаблона.
Мы также должны упомянуть, что переменные cat
и dog
находятся в области видимости и назначаются только тогда, когда соответствующие выражения сопоставления с образцом возвращают значение true
. Следовательно, если мы попытаемся использовать любую переменную в другом месте, код будет генерировать ошибки компилятора.
Как мы видим, эта версия кода намного проще для понимания. Мы упростили код, чтобы значительно сократить общее количество явных приведений типов, и значительно улучшили читаемость.
Кроме того, такой тип тестового шаблона может быть особенно полезен при написании методов равенства .
4. Вывод
В этом кратком руководстве мы рассмотрели сопоставление шаблонов с instanceof
в Java 14. Использование этого нового встроенного улучшения языка помогает нам писать более качественный и читаемый код, что в целом хорошо.
Как всегда, полный исходный код статьи доступен на GitHub .