Рубрики
Без рубрики

Заявление о коммутаторе Java

Подробный учебник о заявлении Switch на Java и его эволюции с течением времени.

Автор оригинала: Nick Melis.

Заявление о коммутаторе Java

1. Обзор

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

тем выключатель заявление позволяет нам заменить несколько вложенных если-else конструкции и тем самым улучшить читаемость нашего кода.

Переключить развивалась с течением времени – новые поддерживаемые типы были добавлены, особенно в Java 5 и 7. Кроме того, она продолжает развиваться – переключить выражения, скорее всего, будут введены в Java 12.

Ниже мы дадим несколько примеров кода, чтобы продемонстрировать использование переключить заявление, роль перерыв заявление, требования к переключить аргумент/ дело значения и сравнение Струнные s в переключатель утверждение.

Давайте перейдем к примеру.

2. Пример использования

Скажем, у нас есть следующие вложенные если-другой Заявления:

public String exampleOfIF(String animal) {
    String result;
    if (animal.equals("DOG") || animal.equals("CAT")) {
        result = "domestic animal";
    } else if (animal.equals("TIGER")) {
        result = "wild animal";
    } else {
        result = "unknown animal";
    }
    return result;
}

Вышеупомянутый код не выглядит хорошо и будет трудно поддерживать и рассуждать о. Для повышения читаемости мы могли бы использовать переключить заявление здесь:

public String exampleOfSwitch(String animal) {
    String result;
    switch (animal) {
        case "DOG":
            result = "domestic animal"; 
            break;
        case "CAT":
            result = "domestic animal";
            break;
        case "TIGER":
            result = "wild animal";
            break;
        default:
            result = "unknown animal";
            break;
    }
    return result;
}

Как показано выше, мы сравниваем переключить аргумент животных с несколькими дело Значения. Если ни один из дело значения равны аргументу, затем блоку под по умолчанию метка выполнена.

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

3. Заявление о перерыве

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

Если мы забудем написать ломать , блоки внизу будут выполнены.

Чтобы продемонстрировать это, давайте опустить перерыв операторов и добавить выход на консоль для каждого блока:

public String forgetBreakInSwitch(String animal) {
    switch (animal) {
    case "DOG":
        System.out.println("domestic animal");
    default:
        System.out.println("unknown animal");
    }
}

Давайте выполним этот код забытьНарушениеНарушение ( “ЛЕНТы.ру”), и проверьте выход, чтобы доказать, что все блоки выполняются:

domestic animal
unknown animal

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

Единственный блок, где перерыв не является необходимым является последним, но добавление перерыв до последнего блока делает код менее подверженным ошибкам.

Мы также можем воспользоваться этим поведением, чтобы опустить перерыв когда мы хотим, чтобы один и тот же код выполнялся для нескольких заявлений по делу. Давайте перепишем пример в предыдущем разделе, сгруппив первые 2 случая:

public String exampleOfSwitch(String animal) {
    String result;
    switch (animal) {
        case "DOG":
        case "CAT":
            result = "domestic animal";
            break;
        case "TIGER":
            result = "wild animal";
            break;
        default:
            result = "unknown animal";
            break;
    }
    return result;
}

4. Переключить Аргумент и значения случая

Теперь давайте обсудим разрешено типы переключить аргумент и дело ценности, требования к ним и то, как переключить заявление работает со строками.

4.1. Типы данных

Мы не можем сравнить все типы объектов и примитивов в переключить утверждение. переключить работает только с четырьмя примитивами и их обертками, а также с enum типа и Струнные класс:

  • byte и байт
  • короткие и короткий
  • int и целое число
  • char и характер
  • enum
  • струна

Струнные тип доступен в переключить заявление, начиная с Java 7.

enum тип был введен в Java 5 и был доступен в переключить заявление с тех пор.

Классы wrapper также доступны с Java 5.

Конечно, переключить аргумент и дело значения должны быть одного и того же типа.

4.2. Нет нулевых значений

Мы не можем пройти нулевой значение в качестве аргумента для переключить заявление . Если мы это сделаем, программа будет бросать NullPointerException, используя наш первый переключить пример:

@Test(expected=NullPointerException.class)
public void whenSwitchAgumentIsNull_thenNullPointerException() {
    String animal = null;
    Assert.assertEquals("domestic animal", s.exampleOfSwitch(animal));
}

Конечно, мы не можем пройти нулевой как ценность для дело этикетка переключить утверждение. Если мы это сделаем, код не будет компилироваться.

4.3. Значения случая как Константы компиляции времени

Если мы попытаемся заменить СОБАКА значение случая с переменным собака код не будет компилироваться до тех пор, пока мы не отметим собака переменная как окончательный :

final String dog="DOG";
String cat="CAT";

switch (animal) {
case dog: //compiles
    result = "domestic animal";
case cat: //does not compile
    result = "feline"
}

4.4. Сравнение струн

Если переключить оператор равенства использовал для сравнения строк, с которые мы не могли сравнить Струнные аргумент созданный с новые оператор к Струнные значение случая правильно.

К счастью, переключить оператор использует равны () метод под капотом .

Давайте продемонстрируем это:

@Test
public void whenCompareStrings_thenByEqual() {
    String animal = new String("DOG");
    assertEquals("domestic animal", s.exampleOfSwitch(animal));
}

5. Переключатель Выражения

JDK 13 теперь доступен и приносит улучшенную версию новой функции, впервые введенной в JDK 12 : переключить выражение.

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

5.1. Новое выражение коммутатора

Давайте посмотрим, что новый переключить выражение выглядит при переключении в течение нескольких месяцев:

var result = switch(month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1;
    case MARCH, MAY, APRIL, AUGUST -> 2;
    default -> 0; 
};

Отправка в значение, как Месяц.ИЮНЬ установит результат 3.

Обратите внимание, что новый синтаксис использует -> оператор вместо толстой кишки мы привыкли с переключить Заявления. Кроме того, нет никакой перерыв ключевое слово: переключить выражение не проходит через дело секунда.

Еще одним дополнением является тот факт, что теперь мы можем иметь запятые-делимитные критерии.

5.2. Ключевое слово доходности

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

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1;
    case MARCH, MAY, APRIL, AUGUST -> {
        int monthLength = month.toString().length();
        yield monthLength * 4;
    }
    default -> 0;
};

Хотя наш пример немного произвольный, здесь дело в том, что у нас есть доступ к более языку Java здесь.

5.3. Возвращение внутри переключателя Выражения

Как следствие различия между переключить заявления и переключить выражения, можно возвращение изнутри переключить заявление, но мы не можем сделать это в течение переключить выражение .

Следующий пример является совершенно действительным и будет компиляции:

switch (month) {
    case JANUARY, JUNE, JULY -> { return 3; }
    default -> { return 0; }
}

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

var result = switch (month) {
    case JANUARY, JUNE, JULY -> { return 3; }
    default -> { return 0; }
};

5.4. Исчерпывающость

При использовании переключить заявления, это действительно не имеет значения, если все случаи охватываются .

Например, следующий код является абсолютно действительным и будет составлять:

switch (month) { 
    case JANUARY, JUNE, JULY -> 3; 
    case FEBRUARY, SEPTEMBER -> 1;
}

Для переключить выражения, хотя, компилятор настаивает на том, все возможные случаи охватываются . Например, следующий фрагмент кода не будет компилироваться, так как нет случая по умолчанию и не все возможные случаи охвачены:

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER -> 1;
}

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

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1;
    case MARCH, MAY, APRIL, AUGUST -> 2;
}

Обратите внимание, что вышеуказанный фрагмент кода не имеет по умолчанию случай. До тех пор, как все случаи охвачены, переключить выражение будет действительным.

6. Заключение

В этом учебнике мы узнали тонкости использования переключить заявление на Java. Мы можем решить, использовать ли переключить на основе читаемости и типа сравненных значений.

Заявление о коммутаторе является хорошим кандидатом для случаев, когда у нас есть ограниченное количество опций в заранее определенном наборе (например, дни недели). В противном случае нам придется изменять код каждый раз, когда добавлена или удалена новая стоимость, что может оказаться неосуществимым. В этих случаях следует рассмотреть другие подходы, такие как полиморфизм или другие шаблоны проектирования, такие как Command.

Как всегда полный JDK 8 код и JDK 13 код доступен на GitHub.