繁体   English   中英

java:循环两个布尔值(假,真)

[英]java: looping on the two boolean values (false, true)

这是一个文体问题。 我要循环两次,一个变量on被设置为false,那么为true。 以下哪个更清楚:

一种)

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

乙)

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

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

更花哨的循环:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM