java:循环上两个布尔值(false,true)

这是一个风格问题。 我想循环两次使用设置为false的变量,然后设置为true。 其中哪一个更清楚:

一个)

 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)别的东西


编辑:墨菲的无意识解释定律开始发挥作用…我原来看起来像这样的用例而不是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); } } } 

但我认为我喜欢Brendan的答案,我只是将循环内容重构为一个单独的方法:

 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); } } } 

由于它是两行,我只是跳过循环并执行:

 doStuffBasedOnABooleanFlag(false); doStuffBasedOnABooleanFlag(true); 

代码更少,更明显,更高效。

另一种选择是避免使用布尔值并使用枚举:

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

然后你可以迭代:

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

或者直接打电话:

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

这样做的好处是API可以更清楚地表明发生了什么。

如果你真的想要使用一个循环,我会选择(a)。 虽然它很新颖,但它也清晰而有效。 我可能会将布尔数组移动到私有静态,以避免每次都重新创建数组。

但我更喜欢布兰登的回答。

这不仅仅是循环,我也非常不喜欢以这种方式使用布尔值。

怎么样的:

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

这仍然会在侦听器中留下布尔值,但是我们不知道doStuffLater方法做了什么。

它可以在for循环中直接完成,而无需创建new数组。

 for (boolean on=false, done=false; !done; done=on, on=true) { System.out.println("on="+on+", done="+done); } 

输出:

 on=false, done=false on=true, done=false 

这不是最明确的方法,所以我不会使用这种方法,除非它在某种内循环中,它会被执行很多次。