Сопоставление с образцом (Pattern Matching) — новая превью функция в Java 14.
Чтобы лучше понять эту новую функцию, давайте посмотрим, как работает оператор instanceof. Если вы уже знакомы с ним, не стесняйтесь переходить к следующему разделу.
Короче говоря, он проверяет, принадлежит ли данный объект заданному типу. В результате этой проверки он возвращает либо true, либо false.
if(animal instanceof Cat) {
// It is a cat! Do something
} else {
// It is not a cat, do something else
}
Этот оператор возвращает true, если ваш объект имеет данный тип или его подтип. В противном случае возвращается false.
Рассмотрим следующий пример. Animal — это класс, который имеет два подкласса: Cat и Dog.
public String getAnimalSound(Animal animal) {
if(animal instanceof Cat) {
Cat cat = (Cat)animal;
return cat.meow();
} else if (animal instanceof Dog) {
Dog dog = (Dog)animal;
return dog.bark();
}
throw new UnknownAnimalException();
}
Мы получаем объект animal на входе. Если объект animal является экземпляром класса Cat, мы хотим, чтобы этот объект говопил «мяу». Если это объект Dog, нам нужно чтобы он лаял. Поскольку этих методов нет в классе Animal, но они есть его подклассах, нам необходимо:
Теперь мы можем использовать наш объект Cat или Dog. Варианты использования этого могут быть довольно разнообразными.
Код выполняет свою работу, но он излишне многословен. Нам обычно нужно сделать все шаги перечисленные выше. Преобразовние типа объекта не нужно, так как мы уже проверили, что у нас есть либо Cat или Dog.
К счастью, в Java 14 появилась новая функция под названием Сопоставление с образцом для instanceof, описанная в JEP 305. В настоящее время это превью функция, поэтому она может измениться в будущем выпуске.
В Java 14 приведенный выше пример может быть упрощен.
// Before Java 14
if(animal instanceof Cat) {
Cat cat = (Cat)animal;
return cat.meow();
}
//After
if(animal instanceof Cat cat) {
return cat.meow();
}
Вот что изменилось:
Это проще, лаконичнее, легче для чтения и менее подвержено ошибкам.
Как уже упоминалось, область действия переменной ограничена только блоком if:
if(animal instanceof Cat cat) {
return cat.meow();
} else {
// Can't use cat here
}
// Can't use cat here either
Однако, вы можете использовать переменную внутри условия if, если у вас есть более сложные условия, такие как AND/OR.
if(animal instanceof Cat cat && cat.isAlive()) {
return cat.meow();
}
После проверки instanceof, после &&, мы можем использовать переменную cat, уже имеющую тип Cat, а не Animal.
Хорошей новостью является то, что в IntelliJ IDEA появилась хорошая поддержка этой функции, представленная в версии 2020.1 (наряду с поддержкой других новых функций Java 14, таких как Records или Улучшенный Switch).
Чтобы попробовать эту функцию самостоятельно, вам нужно установить JDK 14.
Сопоставление с образцом для instanceof функциональности доступно в Java 14. Однако в настоящее время только в качестве функции превью (Preview feature). Что это значит?
Превью возможности языка и VM — это новая функция платформы Java SE, которая полностью специфицирована, реализована, но в то же время определена как временная. Она включается в выпуск JDK для получения обратной связи с разработчиками на основе реального использования; это может привести к тому, что она станет постоянной в будущей платформе Java SE.
Перед следующим выпуском функции JDK будут проанализированы сильные и слабые стороны функции в реальном мире, чтобы решить, имеет ли функция долгосрочную роль в платформе Java SE и, если да, нуждается ли она в уточнении. Следовательно, функции могут быть предоставлены окончательный и постоянный статус (с уточнениями или без них), или пройти дополнительный период предварительного просмотра (с уточнениями или без них), либо они могут быть удалены.
Такие функции поставляются в JDK, но не включены по умолчанию. Вы должны явно разрешить им использовать их. Излишне говорить, что она предназначена не для производственного использования, а скорее для оценки и экспериментов, поскольку она может быть удалена или сильно изменена в будущем выпуске.
В IntelliJ IDEA вы можете включить функции предварительного просмотра в меню File > Project Structure.
В качестве альтернативы, если вы собираете вручную, вам нужно задать следующие параметры для javac:
javac --release 14 --enable-preview ...
Это для компиляции. Во время выполнения вы просто задаете параметр --enable-preview
java --enable-preview ...
Для сборок Maven вы можете использовать следующую конфигурацию:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>14</release>
<compilerArgs>
--enable-preview
</compilerArgs>
```14</source>
<target>14</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
</plugins>
</build>
К сожалению, не доступен сервер mySQL