Языковая конструкция if /else может оказаться неудобно^, если требуется организовать в коде выбор из многих вариантов. Для этой цели в Java имеется оператор switch, полностью соответствующий одноименному оператору в С и С++.
Работая программистом очень часто не хватает даже времени на нормально питание. Хотите недорого поесть, тогда http://banket.spb.ru/nedorogo.html.
Например, организуя выбор из четырех альтернативных вариантов (рис. 3.13), можно написать следующий код:
Scanner in = new Scanner(System.in);
System, out .print ("Select an option (1, 2, 3, 4) ") ;
int choice = in.nextlnt ();
switch (choice) {
case 1:
• Ф •
break; case 2:
• • •
break; case 3:
• • •
break; case 4:
• • •
break; default: // неверный ввод
• • •
break;
}
Выполнение начинается с метки ветви case, соответствующей значению 1 переменной choice, и продолжается до очередного оператора break или конца оператора switch. Если ни одна из меток ветвей case не совпадает со значением переменной, выполняется выражение по метке ветви default (если таковое предусмотрено).
♦ ВНИМАНИЕ! Если не ввести оператор break в конце ветви case, то возможно последовательное выполнение кода по нескольким ветвям case. Очевидно, что такая ситуация чревата ошибками, поэтому мы никогда не пользуемся оператором switch в своих программах.
Если же вы предпочитаете пользоваться оператором switch в своих программах, рассмотрите возможность компиляции их кода с параметром -Xlint:fallthrough, как показано ниже.
javac -Xlint:fallthrough Test.java
В этом случае компилятор выдаст предупреждающее сообщение, если альтернативный выбор не завершается оператором break.
В качестве метки ветви case может быть следующее.
• Константное выражение типа char, byte, short, int (или соответствующие классы-оболочки Character, Byte, Short и Integer, которые будут представлены в главе 4).
• Перечисляемая константа.
• Строковый литерал, начиная с версии Java SE 7.
А если требуется последовательное выполнение кода по нескольким ветвям case, следует пометить охватывающий метод аннотацией @SuppressWarnings ("fallthrough"). В таком случае никаких предупреждений для данного метода не выдается. (Аннотация служит механизмом для предоставления сведений компилятору или инструментальному средству, обрабатывающему файлы с исходным кодом Java или классами. Более подробно аннотации будут рассматриваться в главе 13 второго тома данной книги.)
Рис. 3.13. Блок-схема, поясняющая принцип действия оператора switch
Так, в приведенном ниже фрагменте кода указан строковый литерал в ветви case.
String input = . . .; - switch (input.toLowerCase ())
{
case "yes": // допустимо, начиная с версии Java SE 7
• • •
break;
• • •
}
Когда оператор switch употребляется в коде с перечислимыми константами, указывать имя перечисления в метке каждой ветви не нужно, поскольку оно выводится из значения переменной оператора switch. Например:
Size sz = . . .; switch (sz)
{
case SMALL: //не нужно использовать имя перечисления Size.SMALL
• • •
break;
• • •
}
|