web-dev-qa-db-fra.com

Y a-t-il une différence dans la suppression des accolades des déclarations Si en java

Tout en regardant le tutoriel thenewbostons sur les bases de Java, il nous apprend à faire des déclarations si semblables à celles-ci.

if("pie"== "pie"){
    System.out.println("Hurrah!");
}

Alors j'ai essayé d'enlever les accolades 

if("pie"== "pie")
    System.out.println("Hurrah!");

Et ça marche toujours! Depuis que je suis nouveau sur Java, je ne sais pas pourquoi cela fonctionne. Et je veux savoir si le fait de supprimer (ou d’ajouter) les accolades donne des avantages/inconvénients.

38
user735977

Pour une instruction single, il restera identique, mais si vous souhaitez regrouper plusieurs instructions dans le bloc if, vous devez utiliser des accolades. 

if("pie"== "pie"){
    System.out.println("Hurrah!");
    System.out.println("Hurrah!2");
}

if("pie"== "pie")
    System.out.println("Hurrah!"); //without braces only this statement will fall under if
    System.out.println("Hurrah!2"); //not this one

Vous devriez voir: Blocs en Java

Un bloc est un groupe de zéro ou plusieurs instructions entre des accolades équilibrées et peut être utilisé partout où une seule déclaration est autorisée. Le suivant exemple, BlockDemo, illustre l’utilisation de blocs:

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

(exemple tiré du lien ci-dessus)

34
Habib

Comme @rajesh le dit, les accolades sont facultatives lorsque le corps est une seule déclaration. 

Cela dit, certains styles de codage recommandent de laisser les accolades même pour les cas d'instruction unique, car vous (ou le programmeur qui vient après vous) êtes moins susceptible de faire des erreurs lorsque vous modifiez le code ultérieurement.

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("Tricked you");

La deuxième impression, Tricked you, ne se trouve pas dans la if, elle y ressemble simplement à cause de l'indentation.

Cependant, il ne s'agit que d'un point de style, qui n'est pas universellement accepté, et un programmeur compétent doit pouvoir lire les deux formes.

5
drquicksilver

Non, il n'y a absolument aucune différence: une paire d'accolades fait plusieurs déclarations en une seule; if, while, for, etc. attend une seule déclaration; si vous avez besoin de ne garder qu'une déclaration, vous n'avez pas besoin d'accolades.

Cependant, de nombreux éditeurs de logiciels insistent pour avoir des accolades même pour une seule déclaration. La raison est des erreurs comme celle-ci:

if (x > 20)
    x -= 7;
    y -= 8;

Les affirmations ci-dessus sont trompeuses: l'indentation laisse croire que les deux tâches sont protégées, alors qu'en réalité, seule la première le est. La raison en est que les espaces en Java sont insignifiants: indenter une instruction ne change pas son emplacement dans le flux global du programme. Il est très difficile de trouver des erreurs comme celles mentionnées ci-dessus. Il est donc judicieux d’adopter une règle visant à les éviter.

4
dasblinkenlight

Non, MAIS le danger réel survient lorsque le code est modifié ultérieurement. Il est relativement facile de modifier quelque chose comme:

if (someCondition) 
    // do something 

à

if (someCondition) 
    // do something
    // do something else important

et pensez que le "faire autre chose d'important" ne sera exécuté que si une condition est vraie L'indentation induit en erreur :-) 

Avec des crochets, ce danger n'est pas présent.

2
matt freake

C’est une question de style qui s’applique à plusieurs langages, dont Java, C++, C et C #.

Lorsqu'un bloc de code ne contient qu'une seule ligne, les accolades peuvent être omises. Ceci s’applique à n’importe quelle structure de contrôle: if, while, for, do-while.

Par exemple, les deux boucles ci-dessous sont équivalentes.

for(int i=0; i<100; i++)
  doSomething(i);



for(int i=0; i<100; i++) {
  doSomething(i);
}

Avantage d’omettre {}: Votre code peut être plus court, ce qui signifie moins de lignes. Certains peuvent penser que c'est plus lisible.

Inconvénient d'omettre {}: Si vous modifiez ultérieurement votre code et devez ajouter une autre ligne au bloc de code, n'oubliez pas d'ajouter ces {}. Sinon, vous écrivez le code ci-dessous:

for(int i=0; i<100; i++)
  doSomething(i);
  doSomethingElse(i);

Ceci est vraiment équivalent à:

for(int i=0; i<100; i++) {
  doSomething(i);
}
doSomethingElse(i);
2
Thorn

S'il n'y a qu'une déclaration après if, les accolades ne sont pas obligatoires. 

Maintenant, si vous avez un bloc de code qui doit entrer dans la condition if, vous devez utiliser des accolades.

Ceci vaut également pour loops

2
rajesh

Cela a un inconvénient. Les réponses mentionnées jusqu'à présent sont correctes. Mais il y a des inconvénients à cela du point de vue de la sécurité des choses. Ayant travaillé dans une équipe de paiement, la sécurité est un facteur beaucoup plus important qui motive de telles décisions. Disons que vous avez le code suivant:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

Maintenant, disons que ce code ne fonctionne pas à cause d'un problème interne. Vous voulez vérifier l'entrée. Donc, vous apportez le changement suivant:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

Supposons que vous résolviez le problème et déployiez ce code (et peut-être que le relecteur et vous pensez que cela ne posera pas de problème car il ne se trouve pas dans la condition 'Prod'). Comme par magie, vos journaux de production impriment maintenant les informations de carte de crédit du client qui sont visibles pour tout le personnel pouvant voir les journaux. Dieu nous en préserve si l'un d'entre eux (avec une intention malveillante) s'empare de ces données.

Ainsi, ne pas donner de doublure et un peu de codage négligent peuvent souvent conduire à une violation des informations sécurisées. Il est également classé comme vulnérabilité en Java par CERT - Software Engineering Institure, CMU .

1
kung_fu_coder

Les accolades sont généralement pour avoir un bloc de déclarations. Sans accolades, seule la première ligne sera exécutée dans l'instruction if(). Pas le bloc entier qui commence par { et se termine par }

if("pie" == "pie") {
   System.out.println("Executes if pie==pie");
   System.out.println("So does this");
}

et 

if("pie" == "pie")
   System.out.println("Executes if pie==pie");
System.out.println("Executes, regardless of if pie is equal to pie");

Notez toutefois que si vous souhaitez comparer deux objets String, utilisez la méthode .equals() dans String. Cet exemple fonctionne toujours car il compare une chaîne constante avec elle-même, ce qui est toujours vrai.

1
Aniket Inge

C'est pareil, si le nombre de phrases est égal à un. S'il en existe plusieurs, vous avez besoin de la syntaxe {}

1
Miguel Prz

Non, il n'y a pas de différence entre eux avec une déclaration en réponse à if. Si vous souhaitez ajouter une deuxième instruction en réponse à la variable if, des accolades sont nécessaires.

0
Biswajit

Mes deux centimes. Écrire deux lignes après une déclaration if sans accolades est une erreur que je n’ai jamais vue commettre. Cela dit, les personnes avec qui vous travaillez sont des têtes en os qui ne comprendront pas le tour de magie que vous tirez ici. Enregistrez des choses amusantes comme celle-ci pour votre code privé, mais faites ce que l'on vous dit dans un cadre professionnel ou en classe.

Il existe un argument réel à ce sujet qui illustre une question raisonnable qui pourrait survenir. Comme vous le savez peut-être, tous les espaces et les espaces blancs sont supprimés de votre code lors de son analyse. Des problèmes peuvent survenir lorsque vous essayez d'utiliser des instructions else d'une ligne après plusieurs instructions if d'une ligne. Par exemple:

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
else
    System.out.println("Rats!");

devient impossible à distinguer de

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
    else
        System.out.println("Rats!");

Même dans ce cas, une tabulation automatique devrait indiquer la déclaration if à laquelle la else pointe, mais vous devez certainement vous méfier de cette prudence si vous choisissez de contourner les règles comme je le fais souvent.

0
omikes

Les accolades ne sont utilisées que si vous voulez exécuter un tas de code dans la condition. Si vous n'utilisez pas les accolades, il exécutera uniquement la première instruction après condition if. Les lignes restantes (en dessous de la première déclaration) ne seront pas considérées comme une partie if.

0
Shirish Kulkarni

Si vous ajoutez des accolades à cette instruction if:

if(++colorIndex == someColors.length)
            colorIndex = 0;
        setForeground(currentColor());
        repaint();

Ensuite, cela ne fonctionnera plus.

Donc, je pense que dans certains cas, cela compte.

0
Wim Van Geyt

Cela fonctionnera bien s'il n'y a qu'une déclaration après la condition if.

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("second statement");// this will not print

mais ici les deux déclarations seront imprimées

if("pie"== "pie")
{
System.out.println("Hurrah!");
System.out.println("second statement");
}

Je vous suggère d'utiliser comme ci-dessous même si vous souhaitez imprimer une seule déclaration.

if("pie".equals("pie"))
   {
       System.out.println("Hurrah!");
       System.out.println("second statement");
   }
0
subodh

Et je veux savoir si le fait de supprimer (ou d’ajouter) les accolades apporte des avantages/des inconvénients?

L'avantage de les ajouter est toujours que vous pouvez simplement étendre le bloc de code ultérieurement, sans avoir besoin de les ajouter. Supposons que vous ayez:

if("pie".equals("pie"))
    System.out.println("Hurrah!");

ensuite, si vous souhaitez ajouter une ligne de code supplémentaire, vous devez vous assurer d'ajouter les accolades:

if("pie".equals("pie")) {
    log.debug("I am here!");
    System.out.println("Hurrah!");
}

Si elles sont déjà présentes, placez simplement le curseur à la fin de la ligne, appuyez sur la touche Entrée et commencez à ajouter un nouveau code.

Pour une ligne unique, il n'y a pas de différence technique, mais de nombreuses conventions de code proposent ou même mandatent de les avoir toujours là. Il existe même une règle CheckStyle pour elle.

0
Andreas Fester

Pour une seule déclaration pas un problème

if("pie"== "pie")
System.out.println("Hurrah!");

Pour deux déclarations ou plus après si vous avez besoin des accolades

if("pie"== "pie"){
System.out.println("Hurrah!");
System.out.println("Hi!");
}

Utilisez également .equals () pour comparer plutôt que ==.

0
Raghunandan