Почему компилятор автоматически не помещает операторы 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 был только один путь выполнения. Ниже приведен пример, который покажет вам, сколько дней в месяце.
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.