31 votes

Que font deux blocs de code consécutifs {} {}?

Dupliquer possible:
Blocs de code anonymes en Java

Je viens de tomber sur ce qui suit.

 if ( test ) {
    {
        // statements 1
    }
    {
        // statements 2
    }
}
 

C'est la première fois que je vois ça. Comment ça marche?

53voto

Sapan Diwakar Points 3184

Il s'agit simplement d'écrire deux blocs de code différents afin de masquer les variables locales.

De la réponse à la question " Blocs de code anonyme en Java ":

Les blocs limitent la portée des variables.

 public void foo()
{
    {
        int i = 10;
    }
    System.out.println(i); // Won't compile.
}
 

En pratique, cependant, si vous utilisez un tel bloc de code, c'est probablement le signe que vous souhaitez refactoriser cette méthode en la bloquant.

21voto

DNA Points 16180

Deux exemples de ce qui peut être (un peu) utile pour les tests unitaires, et dans les Interfaces graphiques, qui impliquent souvent répétitives code:

Il est utile dans la GUI de l'immeuble, où il est incroyablement facile à couper-coller les lignes relatives à un composant et d'oublier de les mettre à jour pour le nouveau composant, conduisant à un dur-à-trouver des bugs, par exemple:

    JButton button1 = new JButton("OK");
    button1.setEnabled(false);
    button1.setAlignmentX(-1);

    JButton button2 = new JButton("Apply");
    button1.setEnabled(false);
    button1.setAlignmentX(-1);

Oups, j'ai juste configuré button1 deux fois. Si vous placez chaque bouton dans son propre bloc, alors cette erreur est capté par le compilateur. Encore une fois, vous pourriez créer chaque bouton dans une autre méthode, mais qui peut le rendre difficile à voir ce qui se passe (surtout étant donné le manque de mots-clés les paramètres en Java):

JButton button_ok = makeButton("OK", false, -1);
JButton button_apply = makeButton("Apply", true, 1);
// what exactly is being set here?

...

// much later:
private static JButton makeButton(String name, boolean enabled,
        int alignment)
{
    JButton button = new JButton(name);
    button.setEnabled(enabled);
    button.setAlignmentX(alignment);
    return button;
}

...et vous pouvez vous retrouver avec de nombreuses méthodes, chaque manipulation de différentes variations de paramètres, et chacun n'étant utilisé que peut-être deux fois.

10voto

Kimi Points 2355

Les deux blocs sont indépendants. Ainsi, toutes les variables que vous pourriez avoir dans le premier bloc ne seront pas accessibles dans le deuxième bloc - ou ailleurs en dehors du premier bloc. C'est ce qu'on appelle l' isolation de code ou la portée .

7voto

hmjd Points 76411

{} introduit une portée et les variables déclarées dans la portée n'existent que pour cette portée. Par exemple:

 if ( test ) {

    int i = 0;


    float i = 0;
}
 

échouerait lors de la compilation car i a été déclaré deux fois dans le même périmètre.

 if ( test ) {
    {
        int i = 0;
    }

    {    
        float i = 0;
    }
}
 

compilerait amende puisque i n’a pas été déclaré deux fois dans le même périmètre.

6voto

Bozho Points 273663

Rien. Ils déclarent des blocs de code. Normalement, vous ne les utiliseriez pas. La seule différence sera si vous déclarez une variable dans la première - elle ne sera pas accessible dans la seconde.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X