Вопрос-ответ

Why do we need break after case statements?

Зачем нам нужны операторы break after case?

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

Переведено автоматически
Ответ 1

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

case 'A':
case 'B':
case 'C':
doSomething();
break;

case 'D':
case 'E':
doSomethingElse();
break;

и т.д. Просто пример.

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

Ответ 2

Исторически это связано с тем, что case по сути, определял label, также известную как целевую точку goto вызова. Оператор switch и связанные с ним case на самом деле просто представляют собой многоходовую ветвь с несколькими потенциальными точками входа в поток кода.

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

Ответ 3

Java происходит из C, и это синтаксис из C.

Иногда требуется, чтобы у нескольких операторов case был только один путь выполнения. Ниже приведен пример, который покажет вам, сколько дней в месяце.

class SwitchDemo2 {
public static void main(String[] args) {

int month = 2;
int year = 2000;
int numDays = 0;

switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((year % 4 == 0) && !(year % 100 == 0))
|| (year % 400 == 0) )
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = " + numDays);
}
}
Ответ 4

You can do all sorts of interesting things with case fall-through.

For example, lets say you want to do a particular action for all cases, but in a certain case you want to do that action plus something else. Using a switch statement with fall-through would make it quite easy.

switch (someValue)
{
case extendedActionValue:
// do extended action here, falls through to normal action
case normalActionValue:
case otherNormalActionValue:
// do normal action here
break;
}

Of course, it is easy to forget the break statement at the end of a case and cause unexpected behavior. Good compilers will warn you when you omit the break statement.

java