2010-03-04 18 views
11

Esta es una pregunta estilística. Quiero hacer un bucle dos veces con una variable on que se establece en falso, luego en verdadero. ¿Cuál de estos es más claro:java: bucle en los dos valores booleanos (falso, verdadero)

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) algo más


edición: ley de interpretaciones no deseadas de Murphy entra en juego. .. el caso de uso que originalmente me pareció algo así en lugar 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); 
     } 
    } 
} 

Pero creo que me gusta la respuesta de Brendan, sólo voy a refactorizar el contenido de bucle en un método separado:

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

Supongo que accidentalmente respondiste tu propia pregunta y acabo de ayudarte a darte cuenta? –

+0

heh, yeah .... :-) –

Respuesta

22

Dado que se trata de dos líneas, que acababa de saltar el lazo y hacer:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

Menos código, más obvio, más eficiente.

+0

Prefiero esta respuesta. Simple, claro e imposible de malinterpretar. – Joshua

+0

me gusta eso. el for, final, i = 0 mientras <2 con i == 1?!? y lo que sea demasiado complicado. ¡solo llame al método dos veces! :) Tuve que eliminar mi respuesta porque me equivoqué al ver la pregunta sin demasiada información. dos llamadas a métodos simples son mucho más fáciles de leer. – stmax

+1

por cierto, también tiene el verdadero/falso en el orden incorrecto;) – stmax

3

Si realmente desea utilizar un bucle, yo iría con (a). Si bien es novedoso, también es claro y eficiente. Podría mover la matriz booleana a una estática privada, para evitar volver a crear la matriz cada vez.

Pero me gusta más la respuesta de Brendan.

11

Otra opción sería evitar el booleano y el uso de una enumeración:

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

Se podría entonces o iterar:

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

O hacer las llamadas directamente:

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

La ventaja de esto sería que la API indica más claramente lo que está sucediendo.

+1

Impresionante. Incluso podría terminar colocando el código que FUE en su bucle en su propia clase Mode, Mode.APPEND.doStuff(). De lo contrario doStuff es un método de utilidad no OO - ¡puaj! –

+0

@Bill K: estoy de acuerdo, pero doStuff() en mi caso es un método no estático que necesita acceso a otros métodos no estáticos. –

+0

Los métodos de enumeraciones pueden ser no estáticos y tener acceso a otros elementos dentro de la enumeración. Ellos son muy poderosos, de hecho. Las enumeraciones son clases con todas las funciones, solo limitadas a instancias predefinidas. –

0

No es solo el ciclo, también estoy muy incómodo con el uso de booleanos de esta manera.

¿Qué pasa algo como:

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

Eso todavía deja el booleano dentro del oyente, pero sin saber lo que hace el método doStuffLater eso es por lo que podemos llegar.

+0

Necesito el booleano. No puedo publicar mi código real, es más complicado que esto, y tengo dos listas de componentes de interfaz de usuario, una manejada de una manera y la otra manejada de otra manera. –

Cuestiones relacionadas