Оператор switch

Оператор switch — оператор ветвления в Java. Он предлагает простой способ направления потока выполнения команд по различным ветвям кода в зависимости от значения управляющего выражения. Часто он оказывается эффективнее применения длинных последовательностей операторов if-else-if. Общая форма оператора switch имеет следующий вид:

switch (выражение) { case
значение1:
// последовательность операторов
break;
case значение2:
// последовательность операторов
break;
...
case значениеN:
// последовательность операторов
break;
default:
// последовательность операторов, выполняемая по умолчанию

Выражение должно иметь тип type, short, int или char. Тип каждого значения, указанного в операторах case должен быть совместим с типом выражения. (Для управления оператором switch можно использовать также перечислимое значение. Перечисления описаны в главе 12.) Каждое значение case должно быть уникальной символьной константой (т.е. постоянным значением, а не переменной). Дублирование значений case не допускается.

Оператор switch работает следующим образом. Значение выражения сравнивается с каждым из значений констант в операторах case. При обнаружении совпадения программа выполняет последовательность кода, следующую за данным оператором case. Если значения ни одной из констант не совпадает со значением выражения, программа выполняет оператор default. Однако этот оператор не обязателен. При отсутствии совпадений со значениями case и отсутствии оператора default программа не выполняет никаких дальнейших действий.

Оператор break внутри последовательности switch служит для прерывания последовательности операторов. Как только программа доходит до оператора break, она продолжает выполнение с первой строки кода, следующей за всем оператором switch. Этот оператор оказывает действие "выхода" из оператора switch.

Ниже представлен простой пример использования оператора switch.

// Простой пример применения оператора switch.
class SampleSwitch {
public static void main(String args [ ]) {
for(int i=0; i<6; 1++) switch(i) {
case 0:
System.out.println("i равно нулю.");
break;
case 1:
System.out.println ("i равно единице.");
break;
case 2:
System.out.println("i равно двум.");
break;
case 3:
System.out.println ("i равно трем.");
break;
default:
System.out.println ("i больше 3.");
}
}
}

Эта программа генерирует следующий вывод:

i равно нулю.
i равно единице.
i равно двум.
i равно трем.
i больше 3.
i больше 3.

Как видите, на каждой итерации цикла программа выполняет операторы, связанные с константой case, которая соответствует значению переменной i. Все остальные операторы пропускаются. После того, как значение i становится больше 3, оно перестает соответствовать какой-либо константе case, поэтому программа выполняет оператор default.

Оператор break не обязателен. Если его опустить, программа продолжит выполнение со следующего оператора case. В некоторых случаях желательно использовать несколько операторов case без разделяющих их операторов break.

Вложенные операторы switch

Оператор switch можно использовать в последовательности операторов внешнего оператора switch. Такой оператор называют вложенным оператором switch. Поскольку оператор switch определяет собственный блок, каких-либо конфликтов между константами case внутреннего и внешнего операторов switch не происходит.

В качестве итога можно отметить следующие три важных свойства оператора switch.

  • Оператор switch отличается от оператора if тем, что он может выполнять проверку только равенства, в то время как оператор if может вычислять булевское выражение любого типа. То есть оператор switch ищет только соответствие между значением выражения и одной из констант case.
  • Никакие две константы case в одном и том же операторе switch не могут иметь одинаковые значения. Конечно, внутренний оператор switch и содержащий его внешний оператор switch могут иметь одинаковые константы case.
  • Как правило, оператор switch эффективнее набора вложенных операторов if.
    Последнее свойство представляет особый интерес, поскольку позволяет понять работу компилятора Java. Компилируя оператор switch, компилятор Java будет проверять каждую из констант case и создавать "таблицу переходов", которую будет использовать для выбора ветви программы в зависимости от значения выражения. Поэтому в тех случаях, когда требуется осуществлять выбор в большой группе значений, оператор switch будет выполняться значительно быстрее последовательности операторов if-else. Это обусловлено тем, что компилятору известно, что все константы case имеют один и тот же тип, и их нужно просто проверять на предмет равенства значению выражения switch. Компилятор не располагает подобными сведениями о длинном списке выражений оператора if.



Rambler's Top100