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

时间:2010-03-04 22:30:39

标签: java loops boolean

这是一个风格问题。我想用变量on循环两次,变量设置为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)别的东西


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

6 个答案:

答案 0 :(得分:23)

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

doStuffBasedOnABooleanFlag(false);
doStuffBasedOnABooleanFlag(true);

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

答案 1 :(得分:11)

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

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

然后你可以迭代:

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

或直接拨打电话:

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

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

答案 2 :(得分:3)

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

但我更喜欢布伦丹的答案。

答案 3 :(得分:0)

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

如下:

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

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

答案 4 :(得分:0)

可以直接在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

这不是最清晰的方法,因此除非在某种内部循环中可以执行多次,否则我不会使用这种方法。

答案 5 :(得分:0)

更花哨的循环:

IntStream.range(0, 2).forEach(x -> {
    boolean flag = x == 0;
    doStuffBasedOnABooleanFlag(flag);
});