2013-12-24 3 views
2

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

Может кто-нибудь помочь разобраться во всех деталях?

Вот код:

private static int counter = 0; 

public static Shape randomFactory() { 

    int xVal = rand.nextInt(100); 
    int yVal = rand.nextInt(100); 
    int dim = rand.nextInt(100); 

    switch (counter++ % 3) { 
    default: 
    case 0: 
     return new Circle(xVal, yVal, dim); 
    case 1: 
     return new Square(xVal, yVal, dim); 
    case 2: 
     return new Line(xVal, yVal, dim); 
    } 
} 

В общем, я понимаю эту логику,

Что именно default значит здесь:

switch (counter++ % 3) { 
     default: 

И как switch (counter++ % 3) находка равна случай? И здесь нет ни одного brake.

Любые предложения?

ответ

3

В вашем случае вы используете блок default в самом начале оператора case, что немного странно, поскольку default означает, что эта часть кода будет выполнена, если ни одно из условий случая не будет соответствовать. Вы также должны проверить около fall through. Вы избегали его с возвратом, но обычно это делается с break.

switch (counter++ % 3) рассчитывает сначала counter++ % 3, а затем соответствует ему case.

+0

@ T.J. Кроудер благодарит за это. – user987339

2

default отметит блок, который будет выполнен, если выражение switch не соответствует ни одному case этикеток. В вашем примере default не содержит break, поэтому он провалится и выполнит тот же код, что и для case 0.

Обратите внимание, что, поскольку у вас есть метка case для каждого возможного значения выражения switch, default фактически не работает.

0

default будет выполнен, если нет соответствия в case. В этом случае default бесполезен, так как он никогда не будет выполнен. Рассмотрим следующий случай.

switch(input){ 
    case 1: 
    // do something 
    break; 
    case 2: 
    // do something 
    break; 
    default: 
    // if input is not 1 or 2 this will execute. 
    break; 
} 
0

Предложение default бесполезно здесь: из-за вашего %3 это никогда не случится.

ли вы модифицировать %3 в %4 было бы поймать какие-то данные, но не является ни break, ни return заявление было бы выполнить так же, как case 0.

+0

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

1
default: 

Это просто означает, что ни одно из условий в операторе switch не будет соответствовать соответствующему по умолчанию коду.

0

По умолчанию это одна из ярлыков коммутаторов, которая содержит операторы для выполнения, если ни одна из других меток не совпадает. От JLS §14.11:

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

Значок в этом случае default ничего не сделает, так как всегда будет матч.

0

Существует не перерыв внутри по умолчанию, поэтому он ничего не делает, это просто пример провала.

0

Пожалуйста, прочтите о заявлениях переключателя здесь - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

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

счетчик ++% 3 ..your счетчик был 0, так что будет соответствовать случае 0.

Смежные вопросы