Содержание
Инструкция 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 есть хорошая .
