Переключатель сопоставления с шаблоном, доступный в качестве функции предварительного просмотра в Java 18+, является отличной функцией. Кажется, у него есть ограничение, что вы не можете указать несколько случаев при его использовании. Это понятно, но вызывает вопрос о предполагаемом использовании. Ниже приведен фактический код из моего текущего проекта:
@SuppressWarnings("DuplicateBranchesInSwitch")
static boolean numeric(Type type) {
return switch (type) {
case IntType ignored -> true;
case IntegerType ignored -> true;
case RationalType ignored -> true;
case RealType ignored -> true;
default -> false;
};
}
На самом деле здесь нет проблемы с дублирующимся кодом; просто true
написано четыре раза, и это нормально. Тем не менее, Intellij IDEA считает, что повторяющиеся ветки в принципе плохи (и в других формах переключения они действительно таковы, поэтому я оставляю это предупреждение включенным; пару раз он обнаруживал зарождающиеся ошибки), поэтому я в итоге использовал аннотацию, чтобы подавить предупреждение для этого метода.
Является ли это лучшей практикой здесь, используйте аннотацию для подавления предупреждения в определенных случаях на данный момент, пока более поздняя версия IDEA, вероятно, не отключит его для переключателя сопоставления с образцом? Или есть идиома в использовании этой языковой функции, которую я упускаю?
Честно говоря, эта функция настолько нова, что «лучшая практика», вероятно, еще не установлена.
@shmosel Конечно, в этом случае это сработает одинаково хорошо, но тогда мне нужно будет найти другой, более длинный случай, который послужит примером для вопроса о переключателе сопоставления с образцом.
@DawoodibnKareem Может и так! Тогда, возможно, этот вопрос может стать частью беседы, в ходе которой мы коллективно выясним передовой опыт.
Ну, может быть, но это действительно то, что я ожидаю найти на дискуссионном форуме, а не на сайте вопросов и ответов.
Было бы неплохо, если бы вы могли сделать case IntType | IntegerType i
лайк с catch
.
похоже на баг. IntelliJ IDEA 2023.1, которая в настоящее время находится в раннем доступе, будет иметь исправление.
Похоже на странный вариант использования. Не могли бы вы сделать что-то вроде
Arrays.asList(IntType.class, IntegerType.class, RationalType.class, RealType.class).contains(type.getClass())
?