Зачем нам нужен перерыв после падежа? - PullRequest
90 голосов
/ 26 апреля 2010

Почему компилятор не помещает операторы break после каждого блока кода в коммутаторе? Это по историческим причинам? Когда вы хотите выполнить несколько блоков кода?

Ответы [ 17 ]

1 голос
/ 19 июля 2017

Как уже говорили люди, это разрешить провал, и это не ошибка, это особенность. Если вас раздражает слишком много операторов break, вы можете легко избавиться от них, используя вместо этого операторы return. На самом деле это хорошая практика, потому что ваши методы должны быть как можно меньше (для удобства чтения и поддержки), поэтому оператор switch уже достаточно большой для метода, следовательно, хороший метод не должен содержать ничего другого это пример:

public class SwitchTester{
    private static final Log log = LogFactory.getLog(SwitchTester.class);
    public static void main(String[] args){
        log.info(monthsOfTheSeason(Season.WINTER));
        log.info(monthsOfTheSeason(Season.SPRING));
        log.info(monthsOfTheSeason(Season.SUMMER));
        log.info(monthsOfTheSeason(Season.AUTUMN));
    }

    enum Season{WINTER, SPRING, SUMMER, AUTUMN};

    static String monthsOfTheSeason(Season season){
        switch(season){
            case WINTER:
                return "Dec, Jan, Feb";
            case SPRING:
                return "Mar, Apr, May";
            case SUMMER:
                return "Jun, Jul, Aug";
            case AUTUMN:
                return "Sep, Oct, Nov";
            default:
                //actually a NullPointerException will be thrown before reaching this
                throw new IllegalArgumentException("Season must not be null");
        }        
    }
}   

Выполнение печати:

12:37:25.760 [main] INFO lang.SwitchTester - Dec, Jan, Feb
12:37:25.762 [main] INFO lang.SwitchTester - Mar, Apr, May
12:37:25.762 [main] INFO lang.SwitchTester - Jun, Jul, Aug
12:37:25.762 [main] INFO lang.SwitchTester - Sep, Oct, Nov

как и ожидалось.

0 голосов
/ 26 апреля 2010

Отсутствие автоматического разрыва, добавленного компилятором, позволяет использовать переключатель / регистр для проверки условий типа 1 <= a <= 3, удаляя оператор разрыва из 1 и 2.

switch(a) {
  case 1: //I'm between 1 and 3
  case 2: //I'm between 1 and 3
  case 3: //I'm between 1 and 3
          break;
}
0 голосов
/ 04 мая 2017

Я сейчас работаю над проектом, где мне нужно break в моем операторе switch, иначе код не будет работать. Терпите меня, и я дам вам хороший пример того, почему вам нужно break в вашем заявлении о смене.

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

В этом случае у вас есть:

  1. State1 - Подождите, пока пользователь введет номер
  2. State2 - Вывести сумму
  3. state3 - Рассчитать сумму

Глядя на состояния, вы бы хотели, чтобы порядок поборов начинался с state1 , затем state3 и наконец state2 . В противном случае мы будем печатать только пользовательский ввод без вычисления суммы. Просто чтобы прояснить это еще раз, мы ждем, пока пользователь введет значение, затем рассчитаем сумму и напечатаем ее.

Вот пример кода:

while(1){
    switch(state){
      case state1:
        // Wait for user input code
        state = state3; // Jump to state3
        break;
      case state2:
        //Print the sum code
        state = state3; // Jump to state3;
      case state3:
        // Calculate the sum code
        state = wait; // Jump to state1
        break;
    }
}

Если мы не используем break, он будет выполняться в следующем порядке: state1 , state2 и state3 . Но используя break, мы избегаем этого сценария и можем упорядочить правильную процедуру, которая должна начинаться с state1, затем state3 и, наконец, state2.

0 голосов
/ 08 июня 2016

Вы можете легко разделить другой тип числа, месяц, количество.
Это лучше, чем если в этом случае;

public static void spanishNumbers(String span){

    span = span.toLowerCase().replace(" ", "");
    switch (span){
     case "1":    
     case "jan":  System.out.println("uno"); break;    
     case "2":      
     case "feb":  System.out.println("dos"); break;    
     case "3":     
     case "mar":  System.out.println("tres"); break;   
     case "4":   
     case "apr":  System.out.println("cuatro"); break;
     case "5":    
     case "may":  System.out.println("cinco"); break;
     case "6":     
     case "jun":  System.out.println("seis"); break;
     case "7":    
     case "jul":  System.out.println("seite"); break;
     case "8":    
     case "aug":  System.out.println("ocho"); break;
     case "9":   
     case "sep":  System.out.println("nueve"); break;
     case "10":    
     case "oct": System.out.println("diez"); break;
     }
 }
0 голосов
/ 26 сентября 2014

Это старый вопрос, но на самом деле я натолкнулся на использование кейса без оператора break. Не использовать break на самом деле очень полезно, когда вам нужно комбинировать различные функции в последовательности.

например. использование кодов ответов http для аутентификации пользователя по токену времени

код ответа сервера 401 - токен устарел -> восстановить токен и войти в систему пользователя.
код ответа сервера 200 - токен в порядке -> войти в систему пользователя.

в кейсах:

case 404:
case 500:
        {
            Log.v("Server responses","Unable to respond due to server error");
            break;
        }
        case 401:
        {
             //regenerate token
        }
        case 200:
        {
            // log in user
            break;
        }

Используя это, вам не нужно вызывать функцию входа в систему для ответа 401, потому что при регенерации токена время выполнения переходит в случай 200.

0 голосов
/ 26 апреля 2010

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

0 голосов
/ 26 апреля 2010

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

...