Статьи

Заявление о переключении Java за три минуты

Инструкция switch Java позволяет удобно выбирать один из многих путей выполнения на основе значения переменной. Переменная должна быть перечислением, String или целочисленным типом, например, int . Для switch он сравнивается со списком меток case , каждый из которых указывает значение — как только первый из них совпадает, выполняется соответствующий блок операторов. Оператор switch работает как длинная цепочка ifelseif и часто может использоваться для ее замены.

Эта статья требует только практических знаний о целых числах и строках, но чем больше вы знаете, if и особенно ifelseif тем больше вы получите от этого. Опыт работы с другими числовыми типами , перечислениями и методами является бонусом.

Используя switch

Давайте сразу же начнем с примера! Следующий оператор switch записывает в консоль текстовое представление первых трех натуральных чисел:

 // any number is fine int number = 2; switch (number) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; default: System.out.println("many"); break; } 

Как вы думаете, что произойдет, просто глядя на это?

Переключатель будет смотреть на number , которое в настоящее время равно 2 , и сравнивать его с каждым из значений за ключевыми словами case . Это не 0 , это не 1 , это 2 . Бинго! Так что System.out.println("two") идет вызов System.out.println("two") .

Синтаксис switch

Вы можете использовать оператор switch с переменными типа int , byte , short , char (обратите внимание, что long не работает), String или enum (или тип перечисления, как они формально называются). Вот как это работает:

 switch (<variable>) { case <value>: // statements break; case <other-value>: // statements break; case <more-values>: // statements break; default: // statements break; } 

Вы используете ключевое слово switch за которым следует переменная, которую вы хотите переключить (как это обычно называют), и пара фигурных скобок. Внутри этих фигурных скобок вы указываете столько веток, сколько хотите.

Каждая регулярная ветвь состоит из ключевого слова case , значения, которое соответствует типу переменной (то есть ее можно назначить) и двоеточию. Вместе эти три вещи называются меткой переключателя . За ним следуют операторы, которые вы хотите выполнить, если переменная имеет это конкретное значение. Если у вас нет очень веских причин, каждая ветвь коммутатора должна заканчиваться break . (Я объясню через минуту, почему.)

Если вам нужна ветвь, которая выполняется, если ни одна из меток не совпадает, вы можете создать ветку по default . Это работает как обычная ветка, но не имеет значения.

Проваливаться

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

Следующий оператор начинает отсчет с заданного числа:

 // any number is fine int number = 1; switch (number) { case 0: System.out.println("zero"); // fall-through intended case 1: System.out.println("one"); // fall-through intended case 2: System.out.println("two"); // fall-through intended default: System.out.println("many"); } 

В этом случае выходные данные равняются one two many потому что number соответствует 1 и коммутатор выполняет все блоки, потому что нет разрывов. Комментарий «предназначено для провала» говорит вашим коллегам-программистам, что вы сделали это специально, а не просто забыли добавить break .

switch Return Inside

Многие разработчики считают, что повторение break уродливо, и пытаются вставить переключатели в методы, чтобы они могли вернуть значение. Поскольку return завершает выполнение этого метода, нет риска провалиться и, следовательно, нет необходимости в break .

Для первого примера код может выглядеть следующим образом:

 public String toEnglish(int number) { switch (number) { case 0: return "zero"; case 1: return "one"; case 2: return "two"; default: return "many"; } } 

Короче не так ли? Выполнение System.out.println(toEnglish(2)) будет выводить two .

Другие типы

Я уже упоминал, что вы можете переключаться не только на int . Другие примитивы, которые допускают это, byte , short и char . Вы также можете переключать типы-оболочки Integer , Byte , Short и Character но обратите внимание, что вы получите NullPointerException если переменная равна null .

Вы также можете переключить String

 public int toNumber(String number) { switch (number) { case "zero": return 0; case "one": return 1; case "two": return 2; default: throw new IllegalArgumentException(); } } 

… и перечисляет.

 public enum LittleNumber { ZERO, ONE, TWO } public int toNumber(LittleNumber number) { switch (variable) { case ZERO: return "zero (0)"; case ONE: return "one (1)"; case TWO: return "two (2)"; default: return "unknown"; } } 

Резюме

Вы узнали, как оператор switch соединяется с ключевым словом switch , метками ( case , значение и двоеточие или default и двоеточие) и блоками кода. При первом совпадении код выполняется до тех пор, пока не будет достигнут break , что может означать, что он проваливается в следующие ветви. Чтобы переключатели были короткими, обычно их помещают в методы и возвращают результаты, что позволяет избежать разрывов.

Вооружившись этими знаниями, вы можете погрузиться глубже. Если вам интересно, почему вы не можете использовать long , задайте этот вопрос StackOverflow . Кроме того, вы могли бы вскоре пожелать, чтобы были способы придать ветвям case немного большую выразительность, например, путем проверки, является ли числовое значение меньше другого. Затем вы думаете о сопоставлении с образцом, функция Java еще не поддерживается напрямую, но может скоро . До тех пор реализации библиотек могут быть заменой, и у Javaslang есть хорошая .