2010-03-04 3 views
11

Dies ist eine stilistische Frage. Ich möchte zweimal mit einer Variablen on, die auf false gesetzt ist, und dann auf true. Welche von diesen ist klarer:Java: Schleife auf den zwei booleschen Werten (falsch, wahr)

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) etwas anderes


edit: Murphys Gesetz der unbeabsichtigten Interpretationen ins Spiel kommt. .. der Use Case, den ich ursprünglich so ähnlich sah statt 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); 
     } 
    } 
} 

Aber ich denke, ich Brendan Antwort mag, ich werde nur die Loop-Inhalt in eine separate Methode Refactoring:

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

Ich nehme an, Sie haben dann versehentlich Ihre eigene Frage beantwortet, und ich habe Ihnen nur geholfen, es zu erkennen? –

+0

heh, yeah .... :-) –

Antwort

22

Da es zwei Linien ist, würde ich nur die Schleife überspringen und zu tun:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

Weniger Code, offensichtlicher, effizienter.

+0

Ich bevorzuge diese Antwort. Einfach, klar und unmöglich zu interpretieren. – Joshua

+0

ich mag das. das für, final, i = 0 während <2 mit i == 1?!? und was auch immer viel zu kompliziert ist. rufen Sie die Methode einfach zweimal auf! :) Ich musste meine Antwort löschen, weil ich falsch verstanden habe, die Frage zu lose zu betrachten. Zwei einfache Methodenaufrufe sind viel einfacher zu lesen. – stmax

+1

BTW Sie haben auch das Wahr/Falsch in der falschen Reihenfolge;) – stmax

3

Wenn Sie wirklich eine Schleife verwenden möchten, würde ich mit (a) gehen. Obwohl es neuartig ist, ist es auch klar und effizient. Ich könnte das boolesche Array in eine private Static verschieben, um das Array nicht jedes Mal neu zu erstellen.

Aber ich mag Brendan's Antwort besser.

11

wäre eine weitere Option, die boolean zu vermeiden und eine ENUM verwenden:

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

Oder die Anrufe direkt tun:

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

Sie dann iterieren könnte entweder

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

Der Vorteil davon wäre, dass die API deutlicher anzeigt, was passiert.

+1

Super. Es kann sogar passieren, dass Sie den Code, der sich in Ihrer Schleife befindet, selbst in die Mode-Klasse Mode.APPEND.doStuff() einfügen. Sonst ist doStuff eine Nicht-OO-Utility-Methode - yuck. –

+0

@Bill K: Ich stimme zu, aber doStuff() ist in meinem Fall eine nicht-statische Methode, die Zugriff auf andere nicht-statische Methoden benötigt. –

+0

Enums-Methoden können nicht statisch sein und haben Zugriff auf andere Elemente innerhalb der Enumeration. Sie sind in der Tat sehr mächtig. Enums sind voll ausgestattete Klassen, nur begrenzt auf vordefinierte Instanzen. –

0

Es ist nicht nur die Schleife, ich bin auch wirklich unwohl mit der Verwendung von Booleans auf diese Weise.

Was ist so etwas wie:

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

, die noch die boolean innerhalb des Hörers lässt, aber ohne zu wissen, was die doStuffLater Methode tut, das ist so weit wir gehen können.

+0

Ich brauche den Boolean. Ich kann meinen echten Code nicht posten, er ist komplizierter als das, und ich habe zwei Listen von UI-Komponenten, die eine in die eine Richtung, die andere in die andere Richtung. –

Verwandte Themen