2010-03-04 4 views
11

Ceci est une question de style. Je veux boucler deux fois avec une variable on qui est définie sur false, puis sur true. Lequel de ces est plus clair:java: boucle sur les deux valeurs booléennes (false, true)

A)

for (final boolean on : new boolean[] { false, true}) 
{ 
    doStuffBasedOnABooleanFlag(on); 
} 

B)

for (int i = 0; i < 2; ++i) 
{ 
    final boolean on = (i == 1); 
    doStuffBasedOnABooleanFlag(on); 
} 

C) quelque chose d'autre


modifier: la loi de Murphy d'interprétations inattendues entre en jeu. .. le cas d'utilisation que j'ai à l'origine ressemblé à quelque chose comme ceci au lieu de doStuffBasedOnABooleanFlag:

for (final boolean on : new boolean[] { false, true}) 
{ 
    JButton button = on ? onButton : offButton; 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(on); 
     } 
    } 
} 

Mais je pense que j'aime la réponse de Brendan, je vais juste Refactor le contenu de la boucle dans une méthode distincte:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

    ... 

private void doStuffBasedOnABooleanFlag(final boolean on) 
{ 
    JButton button = on ? onButton : offButton; 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(on); 
     } 
    } 
} 
+0

Je suppose que vous avez accidentellement répondu à votre propre question alors et je vous ai juste aidé à le réaliser? –

+0

heh, yeah .... :-) –

Répondre

22

Depuis ses deux lignes, je venais de sauter la boucle et faire:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

Moins de code, plus évident, plus efficace.

+0

Je préfère cette réponse. Simple, clair et impossible à interpréter. – Joshua

+0

J'aime ça. le pour, final, i = 0 tandis que <2 avec i == 1?!? et tout ce qui est trop compliqué. appelez simplement la méthode deux fois! :) J'ai dû supprimer ma réponse parce que je me trompe en regardant la question trop vaguement. deux appels de méthode simples sont beaucoup plus faciles à lire. – stmax

+1

btw vous avez le vrai/faux dans le mauvais ordre, aussi;) – stmax

3

Si vous voulez vraiment utiliser une boucle, j'irais avec (a). Bien que ce soit nouveau, c'est aussi clair et efficace. Je pourrais déplacer le tableau booléen vers un static privé, pour éviter de recréer le tableau à chaque fois.

Mais j'aime mieux la réponse de Brendan.

11

Une autre option serait d'éviter le booléen et utiliser un ENUM:

enum Mode { APPEND, REPLACE } // or whatever your boolean indicated 

Vous pouvez alors soit itérer:

for(Mode m : Mode.values()) doStuff(m); 

Ou les appels directement:

doStuff(Mode.APPEND); 
doStuff(Mode.REPLACE); 

L'avantage de ceci serait que l'API indique plus clairement ce qui se passe.

+1

Génial. Vous pourriez même finir par mettre le code qui était dans votre boucle dans votre classe Mode elle-même, Mode.APPEND.doStuff(). Sinon, DoStuff est une méthode utilitaire non-OO - beurk. –

+0

@Bill K: Je suis d'accord, mais doStuff() dans mon cas est une méthode non statique qui a besoin d'accéder à d'autres méthodes non statiques. –

+0

Les méthodes Enums peuvent être non statiques et avoir accès à d'autres éléments à l'intérieur de l'énumération. Ils sont très puissants, en fait. les énumérations sont des classes complètes, limitées à des instances prédéfinies. –

0

Ce n'est pas seulement la boucle, je suis également très mal à l'aise avec l'utilisation de booléens de cette façon.

Qu'en est-il quelque chose comme:

ActionListener myListener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(event.getSource() == onButton); 
    } 
    }; 
    onButton.addActionListener(myListener); 
    offButton.addActionListener(myListener); 

Cela laisse encore le booléen au sein de l'auditeur, mais sans savoir ce que la méthode doStuffLater fait c'est aussi loin que nous pouvons aller.

+0

J'ai besoin du booléen. Je ne peux pas poster mon vrai code, c'est plus compliqué que ça, et j'ai deux listes de composants de l'interface utilisateur, l'une gérée dans un sens, l'autre dans l'autre sens. –

Questions connexes