Cas de commutateur Java: avec ou sans accolades?


Considérez les deux extraits suivants, avec des accolades:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

Sans accolades:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

Je sais que, dans l'extrait avec des accolades, une nouvelle portée est créée en enfermant chaque cas entre accolades. Cependant, si chaque cas n'a pas besoin de la nouvelle portée (c'est-à-dire qu'aucun nom de variable n'est réutilisé), y a-t-il une sorte de pénalité de performance pour l'utilisation des accolades avec un cas?

Author: a3f, 2009-03-11

9 answers

Existe-t-il une sorte de pénalité de performance pour l'utilisation des accolades avec un boîtier?

Aucun.

Les accolades sont là pour aider le compilateur comprendre la portée d'une variable, condition, déclaration de fonction, etc. Cela n'affecte pas les performances d'exécution une fois que le code est compilé dans un exécutable.

 82
Author: MrValdez, 2009-03-11 06:05:56

Ceci est un extreme exemple d'optimisation prématurée. Ce serait une meilleure idée de s'inquiéter de la manière la plus facile à lire et à déboguer.

 21
Author: Travis, 2009-03-11 06:20:46

Aucune pénalité de performance du point de vue de l'exécution.

Légère pénalité de performance du point de vue de la compilation car il y a plus à analyser, mais si quelqu'un était réellement préoccupé à ce sujet, il devrait écrire son code sur une seule ligne: -)

Et maintenant pour la partie opinion de notre post... Je mets toujours les { et} parce qu'il y a une pénalité pour la maintenabilité en ce que vous devrez probablement les mettre à une date ultérieure, et cela peut être une douleur de les mettre tard... mais c'est 103% de préférence personnelle.

 18
Author: TofuBeer, 2010-02-22 17:59:10

Comme nous le savons, les accolades pour les cas de commutation ne sont pas nécessaires. L'utilisation de cas d'accolades peut causer une confusion sur la portée d'un cas.

Une accolade d'ouverture est généralement associée à quelque chose de significatif comme le début d'une fonction ou le début d'une boucle ou le début de la déclaration de classe ou le début de l'initialisation du tableau, etc...Nous savons qu'un cas sort du bloc switch lorsqu'il rencontre une instruction break. Ainsi l'utilisation d'accolades semble impliquer l'idée d'une portée différente pour le cas à un ignorant lecteur. Donc, il vaut mieux éviter d'utiliser des accolades pour une meilleure lisibilité de la programmation.

C'est-à-dire quand j'ai quelque chose comme,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"Bonjour à partir de 1" est imprimé. Mais l'utilisation de l'accolade peut suggérer à un lecteur ignorant que le cas se termine par '}', sachant déjà ce que les accolades signifient généralement en cas de boucles, de méthodes, etc.

Comme nous avons des instructions jump-to-label dans 'C', le contrôle passe simplement à case et continue son exécution. Ainsi, avec qui comprendre que c'est juste une mauvaise pratique d'utiliser des accolades lors de l'écriture de cas pour switch.

, Techniquement parlant, vous pouvez entourer de tout bloc de code avec une paire supplémentaire d'accolades lorsqu'il est utilisé avec une syntaxe valide. L'utilisation d'accolades dans switch me semble si mauvaise au moins car elle semble donner une sensation différente comme je l'ai dit ci-dessus.

Ma suggestion : Évitez simplement d'utiliser des accolades environnantes pour les cas de commutation.

 12
Author: Real Red., 2009-03-11 10:55:47

Avec accolades.

Il y a tellement de choses qui peuvent mal tourner avec les instructions switch que j'essaie de les éviter où je peux, c'est-à-dire

  1. Oublier les pauses et donc avoir des chutes de cas
  2. Oubli d'un cas par défaut et donc de ne pas attraper une condition non prise en charge
  3. Réutilisant accidentellement des variables entre les instructions case, ou pire encore, affectant une variable qui partage une variable entre les instructions case.

L'utilisation d'accolades est un moyen d'empêcher partage intentionnel et accidentel des variables entre les déclarations de cas

 8
Author: jklp, 2009-03-11 06:27:07

Cette question va probablement être fermée comme "argumentative" (BRACE WAR!), mais ce que le diable. En fait, j'aime les accolades après le cas. Pour moi, cela fait que la syntaxe de commutateur laide ressemble plus au reste des constructions de langage. (Il n'y a pas de pénalité pour l'utilisation d'accolades dans ce "cas")

 5
Author: Andy White, 2009-03-11 06:07:04

Vous dites que les accolades peuvent être omises car aucun nom de variable n'est réutilisé. En réutilisant les noms de variables, je suppose que vous voulez dire déclarer une nouvelle variable du même type.

Les accolades sont en fait les plus utiles pour vous assurer de ne pas réutiliser la même variable dans différents case s par erreur. Ils ne déclarent aucune variable aujourd'hui, mais quelqu'un les ajoutera demain et sans les accolades, le code est sujet aux erreurs.

 5
Author: Miserable Variable, 2009-03-11 06:13:47

Je n'utiliserais pas d'accolades pour les cas de commutation.

  • La déclaration switch semble déjà assez baroque sans accolades.

  • Les cas de commutation doivent être très courts. Lorsque vous devez déclarer des variables, c'est un signe que vous le faites mal.

Maintenant au maintien d'un code C hérité qui arbore des cas de commutation de plus de 500 lignes ...

 3
Author: starblue, 2009-03-11 09:42:06

Je n'y ai jamais pensé avant. Vous n'avez jamais eu besoin des accolades dans une clause case, vous ne pouvez donc pas vraiment voir pourquoi vous en auriez besoin. Personnellement, je ne vais pas pour l'idée "Ce sera plus facile à maintenir", ce n'est que des ordures, ce sera plus facile à maintenir si le code a du sens et est documenté.

Pas d'accolades ... moins de syntaxe est plus

 1
Author: Gareth Davis, 2009-03-11 06:55:37