— Привет, Амиго!
— Привет, Билаабо! Так рад тебя снова видеть. Только твои лекции такие хорошие и понятные. Не то, что эта Java Memory Model.
— Да, Билаабо умеет выбирать лекции. Сегодня я расскажу тебе про switch.
— Так мне уже про него рассказывали, кажется.
— Элли. Амиго не хочет слушать лекцию про switch? Может, начнешь свою?
— Хочу, хочу. Давай про switch.
— Ок. В Java есть такой оператор — Java switch. Он удобен, когда тебе нужно выполнить определенные действия в зависимости от различных значений некоторой переменной.
Пример со switch | Аналогичный код |
---|---|
|
|
Оператор switch позволяет прыгнуть на нужный кусок кода, если значение переданной в него переменной совпадает со значением, указанным после слова case.
Если i равно 1, то выполнение перейдет на строку помеченную «case 1».
Если i равно 2, то выполнение перейдет на строку помеченную «case 2».
Если i равно 3, то выполнение перейдет на строку помеченную «case 3».
Если переход не выполнился на какой-либо из case’ов, то выполняется на блок, помеченный «default:»
— Ясно. А справа – это та же самая логика, но реализованная с помощью if-ов?
— Ага.
— А что это еще за слово break? Ты же говорил, что его можно использовать только в циклах?
— Да, можно и здесь. При выполнении команды break мы тут же выходим из switch.
Но если команду break убрать, то все строки внутри switch’а будут выполняться до конца.
Пример | Вывод, если i=1 | Вывод, если i=2 |
---|---|---|
|
один два три много |
два три много |
Фактически, case – это метки в коде, и в switch мы прыгаем на очередную метку и… начинаем исполнять весь код до конца switch’а, или пока не встретим break.
— Т.е. если мы не напишем break, то сначала выполнится строчка, на которую мы перепрыгнули, а потом все остальные до закрывающей фигурной скобки «}». Так?
— Да.
— Ничего сложного. Но мне больше нравится с использованием if-ов. Там нет этих бессмысленных break.
— Очень часто if действительно компактнее. Но иногда switch более читабельный.
Сравни:
Пример со switch | Аналогичный код |
---|---|
|
|
— Не сказал бы, что читабельней.
— Ладно, а как насчет такого примера?
Пример со switch | Аналогичный код |
---|---|
|
|
— Что-то Билаабо у тебя не очень-то и выходит. Так break можно не писать, когда return?
— Ага. return сразу приведет к выходу из метода.
— Что-то все время c if-ами выходит компактнее. Но с switch в этот раз вышло читабельней.
— Фух, наконец-то.
Еще одна вещь. Можно не писать default в конце. Тогда просто ничего не произойдет, если ни одна из меток не совпадет.
— Ну, точно, как if-else… но читабельней, гораздо читабельней!
— Отлично. Рад, что тебе понравилась моя лекция.
Чуть не забыл. Изначально внутри switch можно было использовать переменные только примитивных типов и enum’ы. Но теперь туда добавили и поддержку типа String.
— Т.е. я могу написать так:
public int getNumber(String number)
{
switch(number)
{
case "one":
return 1;
case "two":
return 2;
case "three":
return 3;
default:
return -1;
}
}
— Ага. Правда, удобно?
— Да. Отличная штука switch!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ