/
Программирование
/
Курс Java
/

Конструкция Switch

Java: Конструкция Switch

Многие языки используют не только условную конструкцию if, но и switch в дополнение к ней. Конструкция switch — это специализированная версия if, созданная для особых ситуаций.

Например, ее стоит использовать там, где есть цепочка if else с проверками на равенство:

if (status.equals("processing")) {
    // Делаем раз
} else if (status.equals("paid")) {
    // Делаем два
} else if (status.equals("new")) {
    // Делаем три
} else {
    // Делаем четыре
}

У этой составной проверки есть отличительная черта. Каждая ветка здесь проверяет значение переменной status. Конструкция switch записывает такой код короче и выразительнее:

switch (status) {
    case "processing":
        // Делаем раз
        break;
    case "paid":
        // Делаем два
        break;
    case "new":
        // Делаем три
        break;
    default: // else
        // Делаем четыре
}
switch (значение) {
  │
  ├── case "a" → блок 1
  ├── case "b" → блок 2
  ├── case "c" → блок 3
  └── default  → блок по умолчанию
}

С точки зрения количества элементов switch — довольно сложная конструкция. В нее входят:

  • Внешнее описание с ключевым словом switch. В нем два элемента. Это переменная, по значениям которой switch выбирает поведение, и фигурные скобки для вариантов выбора
  • Конструкции case и default, внутри которых описывается поведение для разных значений переменной. Каждый case соответствует if, как в примере выше. Здесь default — особая ситуация, которая соответствует ветке else в условных конструкциях. Как и else, указывать default необязательно
  • Конструкция break, которая предотвращает проваливание. Без нее после нужного case выполнение перейдет к следующему case. Так будет продолжаться до ближайшего break или до конца switch

Фигурные скобки в switch не определяют блок кода, как в других местах. Внутри допустим только тот синтаксис, который показан выше. Там можно использовать case или default. А вот внутри каждого case и default ситуация другая. Здесь выполняется любой произвольный код:

switch (count) {
    case 1:
        // Делаем что-то полезное
        break;
    case 2:
        // Делаем что-то полезное
        break;
    default:
        // Что-то делаем
}

Возврат значения из switch

Иногда результат, полученный внутри case, завершает работу метода, который содержит switch. Тогда его нужно как-то вернуть наружу. Для этого есть два способа.

Первый способ создает переменную перед switch, заполняет ее в case и в конце возвращает наружу:

public static String getExplanation(int count) {
    // Объявляем переменную
    String result;

    // Заполняем
    switch (count) {
        case 1:
            result = "one";
            break;
        case 2:
            result = "two";
            break;
        default:
            result = null;
    }

    // Возвращаем
    return result;
}

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

public static String getExplanation(int count) {
    switch (count) {
        case 1:
            return "one";
        case 2:
            return "two";
        default:
            return null;
    }
}

switch-выражение

У классического switch есть современная форма со стрелочным синтаксисом. Она называется switch-выражение и сразу возвращает значение. Каждая ветка записывается как case значение -> результат;. Здесь не нужны ни break, ни проваливание между ветками:

public static String getExplanation(int count) {
    return switch (count) {
        case 1 -> "one";
        case 2 -> "two";
        default -> null;
    };
}

Одна ветка отрабатывает несколько значений, если перечислить их через запятую:

String season =
        switch (month) {
            case 12, 1, 2 -> "winter";
            case 3, 4, 5 -> "spring";
            case 6, 7, 8 -> "summer";
            default -> "autumn";
        };

switch встречается в коде, но технически без него всегда можно обойтись. Польза этой конструкции в том, что она лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. По сравнению с блоками else if код со switch читается понятнее.

Задание

Реализуйте метод getNumberExplanation(), который принимает на вход число и возвращает объяснение этого числа. Если для числа нет объяснения, то возвращается just a number. Объяснения есть только для следующих чисел:

  • 666 - devil number
  • 42 - answer for everything
  • 7 - prime number

Примеры вызова функции:

App.getNumberExplanation(8);   // just a number
App.getNumberExplanation(666); // devil number
App.getNumberExplanation(42);  // answer for everything
App.getNumberExplanation(7);   // prime number

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются