Je suis tombé sur ce code dans un projet de refactoring Java.
switch ( cmd ) {
case 0:
//Processus A
// fall through
case 1:
case 2:
//Processus B
break;
default:
//Processus C
break;
}
À première vue, le «cas 0» semble n'effectuer que le «traitement A», mais si vous regardez de près, le «cas 0» n'a pas de «pause», donc en fait le «traitement B» est également exécuté. !!
Au début, avez-vous oublié d'écrire «break»? J'ai pensé, mais apparemment, il s'est comporté comme spécifié.
De cette façon, la notation qui omet intentionnellement «break» est appelée ** fall through **. Si vous regardez de près, vous pouvez le voir dans les commentaires.
Cette erreur est une technique très intéressante, mais je pensais que ce serait trompeur et un terrain fertile pour les bugs, alors malheureusement j'ai décidé de la remplacer par la déclaration ʻif`.
if ( cmd == 0 ) {
//Processus A
}
if ( cmd <= 2 ) {
//Processus B
} else {
//Processus C
}
Eh bien, était-ce plus simple avant le changement? C'est subtil. Mais je n'ai plus à me soucier des erreurs de lecture.
Cependant, si cmd
est de type String
, vous ne pouvez pas l'écrire comme ceci. s'inquiéter.
S'il existe une meilleure façon de l'écrire, faites-le moi savoir.
J'étais curieux de connaître la situation dans d'autres langues, alors j'ai jeté un coup d'œil.
break
est omis dans l'instruction switch
break
dans l'instruction switch
break
si vous ne faites rien dans l'instruction case
.goto
.switch
--Perl (précisez suivant
)
--Swift (spécifier fallthrough
)
--Go (spécifier fallthrough
)
switch
mais qui ne peut pas tomber--Ruby (instruction case
)
--Scala (instruction match
)
--Kotlin (instruction when
)
switch
break
pour le casser.Cela dépend de la langue! J'ai beaucoup appris.
Recommended Posts