Главная » Java » switch Java

0

Конструкция switch позволяет передавать управление тому или иному блоку кода, обозначенному именованной меткой, в зависимости от значения целочисленного выражения. Общий синтаксис switch можно представить следующим образом:

switch (целочисленное выражение) {

case n: инструкции

case m: инструкции

default: инструкции

}

Тело switch, известное как блок переключателей (switch bIock), содержит наборы инструкций, которым предшествуют метки, начинающиеся со служебного слова case. Каждой метке case ставится в соответствие целая константа. Если значение целочисленного выражения совпадает со значением некоторой метки, управление передается первой инструкции, следующей за меткой. Если Совпадения значений не’ обнаружено, выполняется первая Инструкция блока default. Если же метка default отсутствует, выполнение switch завершается.

 

 

interface Verbose {// Уровни красноречия человека

       int    SILENT  = 0; //     Безмолвный

       int    TERSE   = 0; //     Немногословный

       int    NORMAL  = 0; //     Нормальный

       int    VERBOSE = 0; //     Многоречивый

 

       void setVerbosity(int level);

       int getVerbosity();

}

 

Приведем фрагмент кода, который предусматривает вывод на экран информации о состоянии субъекта, обладающего определенным уровнем красноречия, и дополнительных сведений, соответствующих более высоким уровням:

 

verbose v = … ; // Инициализация

public void dumpState() {

int verbosity = v.getVerbosity();

 switch (verbosity) {

case verbose.SILENT:

break; // Ничего не делаем

case verbose.VERBOSE: system.out.println(stateDetails); // Идем далее

case verbose.NORMAL: system.out.println(bas;cState); // Идем далее

case verbose.TERSE: system.out.println(summaryState); break;

default:

throw new IllegalStateException( "verbosity=" + verbosity);

    }

}

При передаче управления соответствующей метке выполняются все следующие за ней инструкции – даже те, которые снабжены собственными метками case. Комментарий / / Идем далее, содержащийся в тексте нашего примера, отмечает те места кода, где управление переходит к очередному блоку case. Если, скажем, переменная verbosity содержит значение VERBOSE, будут осуществлены все три обращения к методу ргintln при значении NORMAL программа выведет на экран два сообщения; наконец, если содержимое verbosity равно TERSE, будет выполнен один вызов ргintln.

Очередная метка case или default, встретившаяся в процессе выполнения кода, сама по себе не служит признаком завершения блока переключателей. Если по окончании блока case необходимо возвратить управление за пределы конструкции switch, следует сделать это явно, с помощью команды break. Будучи использованной в контексте switch, команда break передает управление первой инструкции, следующей за блоком переключателей. Вот почему мы употребили break в конце набора инструкций, соответствующего метке case Verbose. TERSE; в противном случае программа "соскользнула" бы через метку default к команде выбрасывания исключения. В случае case verbose. SILENT Команда break – единственная Инструкция, поскольку никаких иных действий Выполнять не нужно.

Рассмотренный способ "прохождения" через последовательность блоков case в некоторых ситуациях достаточно удобен. Чаще всего, однако, каждый блок case следует завершать командой break. Если в каких-то случаях break преднамеренно исключается, их необходимо четко оговаривать с помощью комментариев.

Блоку может соответствовать несколько меток case, если различным значениям проверяемого целочисленного выражения отвечает единственный набор инструкций программы. Ниже в качестве иллюстрации приведен пример метода, который выполняет преобразование символа, представляющего шестнадцатеричную Цифру, в число типа int.

public int hexvalue(char ch) throws NOnHexDigitException {

switch (ch) {

case ‘0’:

case ‘1’:

case ‘2’:

case ‘3’:

case ‘4’:

case ‘5’:

case ‘6’:

case ‘7’:

case ‘8’:

case ‘9’:

 

return (ch – ‘0’);

case ‘а': case ‘b': case ‘с':

case ‘d': case ‘е': case ‘f':

return (ch – ‘а’) + 10;

case ‘А': case B': case ‘с': case ‘D': case ‘Е': case ‘F':

return (ch – ‘А’) + 10;

default:

throw new NonHexDigitException(ch);

    }

}

Здесь мы обошлись без использования команд break, поскольку их функцию выполняют соответствующие инструкции return, завершающие выполнение не только блока переключателей, но и тела метода в целом.

Последний блок case или default всегда следует завершать командой break, или return, или throw, не полагаясь на то, что, дескать, конструкция исчерпывается "естественным" образом. Подобная мера позволит избежать недоразумений, если в будущем придется дополнить код блока переключателей новыми предложениями case.

В заголовке switch могут быть использованы выражения типа char, byte, short или int. В метках case разрешается задание только постоянных выражений – литералов или именованных констант, инициализированных постоянными значениями, – допускающих присваивание переменным того типа, к которому относится выражение заголовка switch, без необходимости явных преобразований. В пределах блока переключателей все метки case должны быть уникальны и не позволяется использовать больше одной метки default.

Метками case разрешается обозначать только такие инструкции, которые непосредственно расположены внутри блока переключателей. Это означает, что нельзя передавать управление напрямую внутрь циклов или блоков { }, вложенных в выражение switch.

Перед первым выражением внутри блока переключателей должна быть расположена метка case, поскольку в противном случае компилятор воспримет код, не относящийся ни к одной из меток, как недостижимый и выдаст сообщение об ошибке.

Упражнение 7.2. Перепишите код, решающий задание из упражнения 7.1, с помощью выражения switch.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии