Pourquoi avons-nous besoin de pause après l'affaire états?
Pourquoi ne pas le compilateur de mettre automatiquement break après chaque bloc de code dans le switch? Est-ce pour des raisons historiques? Quand voulez-vous de plusieurs blocs de code à exécuter?
- Fait une réponse à propos de JDK-12 et commutateur étiquettes de réforme afin de ne pas mandat
break
.
Vous devez vous connecter pour publier un commentaire.
Il est parfois utile d'avoir plusieurs cas associé avec le même bloc de code, tels que
etc. Juste un exemple.
Dans mon expérience, il est généralement mauvais style de "tomber" et ont plusieurs blocs de code à exécuter pour un cas, mais il peut être utilise dans certaines situations.
// Intentional fallthrough.
lorsque vous omettez de faire une pause. Ce n'est pas tellement un mauvais style comme "facile d'oublier une rupture accidentelle" à mon avis. P. S. bien sûr pas dans les cas simples, comme dans la réponse elle-même.case
s sont empilés ensemble de cette façon. Si il y a de code entre eux, alors oui, le commentaire est probablement mérité.case
, comme suit:case 'A','B','C': doSomething(); case 'D','E': doSomethingElse();
, sans avoir besoin d'une pause entre les cas. Pascal pouvait le faire: "L'instruction de cas, compare la valeur de ordinale expression pour chaque sélecteur, ce qui peut être une constante, un sous-groupe, ou une liste d'entre eux séparés par des virgules." (wiki.freepascal.org/Case)Historiquement, c'est parce que la
case
était essentiellement la définition d'unlabel
, aussi connu comme le point cible d'ungoto
appel. L'instruction switch et ses associés des cas vraiment juste représentent un multiway de la direction, avec de multiples points d'entrée possibles dans un flux de code.Tout ce que dit, il a été noté un nombre presque infini de fois que
break
est presque toujours le comportement par défaut que vous préférez vous avez à la fin de chaque cas.Java vient de C et qui est de la syntaxe de C.
Il y a des moments où vous souhaitez que plusieurs cas de déclarations pour avoir un chemin d'exécution.
Ci-dessous est un exemple qui va vous dire combien de jours dans un mois.
Je pense que c'est une erreur. Comme une structure du langage, il est tout aussi facile d'avoir
break
comme valeur par défaut, au lieu d'avoir unfallthrough
mot-clé. La plupart du code que j'ai écrit et de la lecture a une pause après chaque cas.continue <case name>
qui permet de spécifier explicitement avec lequel cas de déclaration de continuer;case
dans le courant de l'switch
, cela devient tout simplement ungoto
. 😉Vous pouvez faire toutes sortes de choses intéressantes avec cas de chute à travers.
Par exemple, disons que vous voulez faire une action particulière pour tous les cas, mais dans certains cas, vous voulez faire une action plus quelque chose d'autre. À l'aide d'une instruction switch avec fall-through serait assez facile.
Bien sûr, il est facile d'oublier le
break
déclaration à la fin d'un cas et de provoquer un comportement inattendu. Bon compilateurs vous avertira si vous omettez l'instruction break.En laissant de côté la bonne désir d'être en mesure d'utiliser la même bloc pour plusieurs cas (ce qui pourrait être spécial camelcase)...
C'est principalement pour assurer la compatibilité avec le C, et est sans doute un ancien hack depuis les jours de vieux quand
goto
mots-clés parcouraient la terre. Il ne permettre des choses incroyables, bien sûr, comme Duff de l'Appareil, mais si c'est un point en sa faveur ou contre, c'est... argumentatif au mieux.De sorte que vous ne pas avoir à répéter le code si vous avez besoin de plusieurs cas de faire la même chose:
Ou vous pouvez faire des choses comme :
Dans une cascade de mode.
Vraiment un bug/confusion sur le ventre, si vous me demandez.
do this
etdo that
pour cela, mais justedo that
pour qui?Java est dérivé de C, dont le patrimoine inclut une technique connue sous le nom Duff de l'Appareil .
C'est une optimisation qui s'appuie sur le fait que le contrôle passe à travers d'un cas à l'autre, en l'absence d'un
break;
déclaration. Par le temps C était normalisé, il y avait beaucoup de code tel qu'il est "dans la nature", et qu'il aurait été contre-productif pour changer la langue de briser ce genre de constructions.Autant que le record historique de passe, Tony Hoare a inventé le cas dans les années 1960, lors de la "programmation structurée" de la révolution. Tony le cas de déclaration de multiples étiquettes par cas et sortie automatique sans puant
break
consolidés. L'exigence expresse de labreak
était quelque chose qui venait du BCPL/B/C ligne. Dennis Ritchie écrit (ACM HOPL-II):Je n'ai pas été en mesure de trouver toute les écrits historiques sur BCPL, mais Ritchie commentaire suggère que la
break
était plus ou moins un accident historique. BCPL plus tard, a résolu le problème, mais peut-être Ritchie et Thompson étaient trop occupés à inventer Unix à être dérangé par tel détail 🙂La
break
après commutateurcase
s est utilisé pour éviter les fallthrough dans les instructions de commutation. Mais il est intéressant de noter ce peut maintenant être atteint par le biais de la nouvellement formée commutateur étiquettes en œuvre par le biais JEP-325.Avec ces changements, la
break
avec chaque commutateurcase
peut être évité, comme l'ont démontré en outre :-Sur l'exécution du code ci-dessus avec JDK-12, le comparative de sortie pourrait être considéré comme
et
et bien sûr, la chose inchangé
Que les gens ont dit avant, c'est de permettre à l'automne et il n'est pas une erreur, c'est une fonctionnalité.
Si un trop grand nombre
break
déclarations de vous ennuyer, vous pouvez facilement se débarrasser d'eux en utilisantreturn
plutôt les instructions. C'est effectivement une bonne pratique, parce que vos méthodes doit être aussi petite que possible (pour des raisons de lisibilité et maintenabilité), donc unswitch
déclaration est déjà assez grand pour une méthode, par conséquent, une bonne méthode ne doit pas contenir autre chose, c'est un exemple:L'exécution des tirages:
comme prévu.
De ne pas avoir de coupure ajouté par le compilateur rend possible l'utilisation d'un commutateur/cas de test pour des conditions comme
1 <= a <= 3
par la suppression de l'instruction break à partir de 1 et 2.parce qu'il y a des situations où vous voulez à circuler à travers le premier bloc pour éviter par exemple d'écrire le même code en plusieurs blocs, mais encore être en mesure de les répartir de manière plus de contrôle. Il y a aussi une tonne d'autres raisons.
C'est une vieille question, mais en fait, j'ai couru en utilisant le cas sans pause déclaration d'aujourd'hui. Pas à l'aide de la rupture est en fait très utile lorsque vous avez besoin de combiner différentes fonctions dans l'ordre.
en utilisant par exemple des codes de réponse http pour authentifier l'utilisateur avec le temps jeton
code de réponse du serveur 401 - jeton est obsolète -> régénérer jeton et journal de l'utilisateur.
code de réponse du serveur 200 - jeton est OK -> le journal de l'utilisateur dans.
en cas de danger:
À l'aide de ce que vous n'avez pas besoin de journal d'appels en fonction de l'utilisateur pour la réponse 401 parce que lorsque le jeton est régénéré, l'exécution saute dans le cas de 200.
Vous pouvez les rend facilement repérables autre type de nombre, le mois, le comte.
C'est mieux alors si dans ce cas;
Je travaille actuellement sur un projet où j'ai besoin de
break
dans mon instruction switch sinon le code ne fonctionne pas. Ours avec moi et je vais vous donner un bon exemple de pourquoi vous avez besoin debreak
dans votre instruction switch.Imaginez que vous avez trois états, l'un qui attend pour l'utilisateur de saisir un nombre, la deuxième pour le calculer et le troisième à l'impression de la somme.
Dans ce cas, vous avez:
En regardant les états, vous voulez que l'ordre de prélèvement pour démarrer sur état1, puis state3 et enfin état2. Autrement, nous allons seulement de l'impression à l'utilisateur d'entrer sans le calcul de la somme. Juste pour préciser à nouveau, nous nous attendons à l'utilisateur d'entrer une valeur, puis calculer la somme et d'estampes de la somme.
Voici un exemple de code:
Si nous n'utilisons pas de
break
, il exécutera dans cet ordre, état1, état2 et state3. Mais à l'aide debreak
, nous éviter ce scénario, et peut ordonner dans le droit de la procédure qui consiste à commencer avec état1, puis state3 et dernier mais pas moins état2.Exactement, car avec certains placement intelligent, vous pouvez exécuter les blocs en cascade.