Содержание
Инструкция switch Java позволяет удобно выбирать один из многих путей выполнения на основе значения переменной. Переменная должна быть перечислением, String
или целочисленным типом, например, int
. Для switch
он сравнивается со списком меток case
, каждый из которых указывает значение — как только первый из них совпадает, выполняется соответствующий блок операторов. Оператор switch работает как длинная цепочка if
— else
— if
и часто может использоваться для ее замены.
Эта статья требует только практических знаний о целых числах и строках, но чем больше вы знаете, if
и особенно if
— else
— if
тем больше вы получите от этого. Опыт работы с другими числовыми типами , перечислениями и методами является бонусом.
Используя 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 есть хорошая .