2011-04-04 2 views
2

Doublons possibles:
Efficiency of Java “Double Brace Initialization”?
Meaning of new Class(…){{…}} initialization idiomdouble {{}} question de syntaxe dans java

Supposons que je créé un JMenu Bar de la façon suivante:

 

JMenuItem saveMenuItem = new JMenuItem("Save") 
    {{ 
     addActionListener(new ActionListener() { 

       public void actionPerformed(ActionEvent e) 
       { 
        String location = GUI.Custom.QuickDialogs.selectFile(false); 
        try 
        { 
         PrintWriter pw = new PrintWriter(new File(location)); 
         String text = textArea.getText(); 
         pw.println(text); 
         pw.flush(); 
         pw.close(); 
        } 
        catch(Exception ex) 
        { 
         textArea.append("Could not save this debug output"); 
        } 
       } 
      }); 
    }}; 

    JMenu optionsMenu = new JMenu("Options") 
    {{ 
     add(saveMenuItem); 
     setVisible(true); 
    }}; 

    private JMenuBar menuBar = new JMenuBar() 
    {{ 
     add(optionsMenu); 
     setVisible(true); 
    }}; 
 

Est-ce un mauvais motif de conception pour créer des objets ay par opposition à simplement déclarer la variable, puis créer dans un constructeur ou quelque chose?

+0

duplication possible de [Efficacité de Java "Initialisation Double Brace"?] (Http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) et/ou [Signification de double accolade idiome d'initialisation] (http://stackoverflow.com/questions/1372113/meaning-of-new-class-initialization-idiom) – BalusC

+0

Je ne suis pas vraiment inquiet de l'efficacité, je suis plus inquiet à ce sujet en créant un cas de coin ou un autre problème que je manque. Je pensais juste qu'il y avait une raison pour laquelle je ne le vois pas trop souvent. – user489041

Répondre

0

Comme la plupart des questions de cette nature, je dois malheureusement dire "ça dépend". Quand vous le faites de cette façon, vous créez réellement une nouvelle classe anonyme, donc il y a une légère baisse de performance en termes de mémoire et de CPU, mais dans la plupart des cas, je dirais que c'est assez insignifiant pour l'ignorer. Si vous le faites de cette façon, votre code deviendra plus lisible, et si c'est le style que le reste de votre équipe utilise, je dirais que ça va avec.

+0

De plus, vous dites: "Tout cela est créé de façon statique dans la classe". Ce n'est pas vrai car l'initialiseur n'est pas statique, mais est appelé sur l'instance de classe anonyme. –

+0

Oh, je vois. Mise à jour Ill – user489041

1

Vous semblez demander (au moins) deux choses différentes ici. L'idiome à double parenthèse est connu et souvent utilisé comme raccourci pour créer des classes internes anonymes, remplaçant le constructeur explicite par un bloc d'initialisation. Habituellement, cela rend le code plus lisible, donc je dirais que c'est OK. OTOH puisque les blocs d'initialisation (non statiques) sont un ajout relativement récent au langage, mais certains développeurs ne les connaissent peut-être pas, ce qui peut créer de la confusion. Et bien sûr, comme avec presque toutes les techniques, lorsqu'il est surutilisé, il peut créer plus de problèmes qu'il n'en résout.

2

Ce que vous avez fait s'appelle: "bloc d'initialisation".

De doc:

Les copies du compilateur Java initialiseur blocs dans tous les constructeurs. Par conséquent, cette approche peut être utilisée pour partager un bloc de code entre plusieurs constructeurs

Exemple:

class A { 
    private String field1; 

    { 
     field1 = "example field"; 
     field2 = getstaticResult(); 
    } 

} 

Mais à mon avis, nous ne devrions pas utiliser ce très souvent et surtout dans votre cas, il est très inhabituel de l'utiliser.

1

Rien réellement tort avec Double Brace Initialization; Je l'utilise souvent pour des cartes et des listes.

Cela dépend peut-être de qui est votre public - est-ce que les autres membres de votre équipe comprennent ce que vous faites ici? Rappelez-vous qu'un jour, quelqu'un devra lire ce code.

0

Deux problèmes

  • Références: Leaking Puisque ce sont les classes internes anonymes, ils gardent une référence à l'objet qui entoure les empêcher d'être collectées. Cela pourrait causer des fuites de mémoire difficiles à trouver.

  • Types anonymes: Pour tout ce qui dépend de la classe exacte, cela peut causer des problèmes. Par exemple, la sérialisation et certaines implémentations d'égales peuvent ne pas fonctionner comme prévu.

Si vous savez que ce qui précède n'est pas un problème, il n'y a rien de mal à utiliser cette syntaxe.