2013-12-25 4 views
1

Я встретил эти вариации оператора switch, и мне интересно узнать, в каких случаях его можно использовать?Странная семантика состояния переключателя

Странность - это потому, что она не имеет случаев до значения по умолчанию, только после. И не имеет инструкции break. Но отлично работает.

Вот код:

public static Item newItem() { 
    switch (rand.nextInt(3)) { 
    default: 
    case 0: 
     return new Scissors(); 
    case 1: 
     return new Paper(); 
    case 2: 
     return new Rock(); 
    } 
} 

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

Вопрос: почему мы должны написать:

default: 
case 0: 

вместо Типичное использование:

case 0: 
default: 

Компилятор не позволял изменять или комментировать default заявление.

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

PS пожалуйста, не пишите глупые объяснения, как делает switch работы. ясно. пишите только об этом явном примере.

BTW Я встретил этот мир кода в Thinking in Java by Bruce Eckel.

+0

Возможный дубликат [Почему нам нужно перерыв после заявления о делах?] (Http://stackoverflow.com/questions/2710300/why-do-we-need-break-after-case-statements) –

+1

'return' заставляет коммутатор выйти из метода, поэтому ни один из следующих параметров не выполняется. –

ответ

3

Филиал default просто означает «ветвь для всех опций явно не указано Это соглашение, чтобы положить его в конце switch-case заявления, но не требуется

break также не требуется -.. Если ветвь switch-case не заканчивается break, она просто продолжит выполнение кода в следующей ветке - это называется fallthrough. Однако здесь вам это не нужно, потому что каждая ветвь всего return s, поэтому выполнение функции не продолжается.

1

Return вызывает выход. Нет необходимости добавлять оператор break.

+0

, но почему после инструкции по умолчанию. –

+0

Независимо от того, где вы помещаете оператор 'default'. Хотя это обычно делается в конце инструкции 'switch'. – MillaresRoo

0

break не является обязательным. Если случай соответствует, и не встречается break, то выполняется без проверки. case. Вот почему

case 0: 
default: 
    // Some code here 

работает так, как вы ожидаете.

default кейс специальный. Выполняется, если нет других case. Неважно, где вы его положили (в начале, посередине или (как принято) в конце).

В вашем коде, если case 0: совпадений, case 1: не выполняется только потому, что функция никогда не заходит так далеко: вместо этого возвращается new Scissors().

-1

Код может быть изменен для улучшения читаемости и стандартный вид:

switch(...) 
{ 
    case 0: 
    ... 
    case 1: 
    ... 
    case 2: 
    ... 
    default: 
    // Not reachable 
    throw new RuntimeException("Unexpected value"); 
} 

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

0

Метод должен возвращать значение, как было объявлено методом, поэтому он должен иметь оператор return. Если вы прокомментируете default, метод может не вернуть значение. Неважно, где вы положили default, но вы должны сделать это, чтобы выполнить условие возврата.

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