Переключатель Java без выражения
В GoLang у вас может быть переключатель без выражения, где случаи заменяют ряд каскадных операторов if.
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
В Java 19 я могу смоделировать это с помощью такого хака, используя сопоставление шаблона переключения с «защищенным шаблоном», и когда основное выражение всегда истинно, а защищенный шаблон выполняет реальную работу.(Или в Java 17, но с использованием&&
вместоwhen
)
int num=5;
switch (System.out) {
case Object o when num>100 -> System.out.println("Big");
case Object o when num>50 -> System.out.println("Med");
default -> {System.out.println("Small");}
}
Очевидно, что эти простые случаи могут быть записаны без переключателя, но когда у вас есть длинная последовательность if-else-if=else, не обязательно для одной и той же переменной, такая структура может быть более лаконичной.
Кто-нибудь знает более приятный способ сделать это?
1 ответ
Есть несколько принципов, которые я могу придумать, которые могут помочь в принятии решений в подобных ситуациях:
- Избегайте чрезмерной инженерии
- Принцип наименьшего удивления
- Используйте правильный инструмент для работы
Оператор switch используется для выполнения различных путей кода на основе возможных значений конкретной переменной.
Само понятие «переключатель» основано на идее более чем одного результата, который чем-то контролируется; в случае оператора это что-то является выражением переключения. Если выражения переключения нет, то это не переключатель, а набор взаимоисключающих правил.
Еще одной идеей изобретения оператора была возможность оптимизации. Первоначальные реализации операторов использовали высокоэффективные таблицы поиска, поэтому они могли работать только с
Когда я вижу оператор switch, я ожидаю увидеть различные действия, основанные на разных значениях конкретной переменной; Я не ожидаю, что там что-то делается. Если я изучу код и замечу, что мои ожидания не оправдались, я сильно удивлюсь. Разочарован даже.
Итак, лучший способ сделать это — вернуться к старому доброму, знакомому, испытанному, каскадному
Тот факт, что golang позволяет создавать бессмысленные