Ich bin auf diesen Code in einem Java-Refactoring-Projekt gestoßen.
switch ( cmd ) {
case 0:
//Prozess A.
// fall through
case 1:
case 2:
//Prozess B.
break;
default:
//Prozess C.
break;
}
Auf den ersten Blick scheint "Fall 0" nur "Verarbeitung A" auszuführen, aber wenn Sie genau hinschauen, hat "Fall 0" keine "Unterbrechung", so dass tatsächlich auch "Verarbeitung B" ausgeführt wird. !!
Hast du zuerst vergessen, "Pause" zu schreiben? Ich dachte, aber anscheinend hat es sich wie angegeben verhalten.
Auf diese Weise wird die Notation, die absichtlich "break" weglässt, ** fall through ** genannt. Wenn Sie genau hinschauen, können Sie es in den Kommentaren sehen.
Dieser Fallthrough ist eine sehr interessante Technik, aber leider habe ich beschlossen, sie durch die "if" -Anweisung zu ersetzen, weil ich dachte, sie wäre irreführend und ein Nährboden für Fehler.
if ( cmd == 0 ) {
//Prozess A.
}
if ( cmd <= 2 ) {
//Prozess B.
} else {
//Prozess C.
}
War es vor dem Wechsel einfacher? Es ist subtil. Aber ich muss mir keine Sorgen mehr machen, dass ich falsch lese.
Wenn cmd
jedoch vom Typ String
ist, können Sie es nicht so schreiben. sich Sorgen machen.
Wenn es einen besseren Weg gibt, es zu schreiben, lass es mich wissen.
Ich war neugierig auf die Situation in anderen Sprachen und habe einen kurzen Blick darauf geworfen.
--Perl (geben Sie "next" an) --Swift (geben Sie "Fallthrough" an) --Go ("Fallthrough" angeben)
--Ruby (case
Anweisung)
--Scala (match
Anweisung)
--Kotlin (when
Anweisung)
Es kommt auf die Sprache an! Ich habe viel gelernt.
Recommended Posts