【问题标题】:java: looping on the two boolean values (false, true)java:循环两个布尔值(假,真)
【发布时间】:2011-01-23 21:39:34
【问题描述】:

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


编辑:墨菲的意外解释定律开始发挥作用......我最初看起来像这样的用例而不是 doStuffBasedOnABoleanFlag:

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

【问题讨论】:

  • 我猜你当时不小心回答了自己的问题,而我只是帮助你意识到了这一点?
  • 我个人的偏好是:for (boolean option : Arrays.asList(false, true))

标签: java loops boolean


【解决方案1】:

更多花哨的循环:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      但我更喜欢 Brendan 的回答。

      【讨论】:

        【解决方案4】:

        不仅仅是循环,我也很不习惯以这种方式使用布尔值。

        类似的东西呢:

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

        这仍然将布尔值留在侦听器中,但不知道 doStuffLater 方法的作用是什么。

        【讨论】:

        • 我需要布尔值。我无法发布我的真实代码,它比这更复杂,而且我有两个 UI 组件列表,一个以一种方式处理,另一个以另一种方式处理。
        【解决方案5】:

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

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

        然后你可以迭代:

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

        或者直接调用:

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

        这样做的好处是 API 可以更清楚地指示正在发生的事情。

        【讨论】:

        • 太棒了。您甚至可能最终将循环中的 WAS 代码放入您的 Mode 类本身,Mode.APPEND.doStuff()。否则,doStuff 是一个非面向对象的实用方法——呸。
        • @Bill K:我同意,但在我的例子中 doStuff() 是一个非静态方法,需要访问其他非静态方法。
        • 枚举方法可以是非静态的,并且可以访问枚举中的其他项目。事实上,它们非常强大。枚举是功能齐全的类,仅限于预定义的实例。
        【解决方案6】:

        既然是两行,我就跳过循环然后做:

        doStuffBasedOnABooleanFlag(false);
        doStuffBasedOnABooleanFlag(true);
        

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

        【讨论】:

        • 我更喜欢这个答案。简单、清晰且不会被误解。
        • 我喜欢这样。 for, final, i = 0 while
        • 我一开始的顺序错了,但它已经修复(假然后真)。谢谢 stmax。
        • 我也喜欢这个。我的真实代码没有两个方法调用,它有大约 5 行内容,包括一个内部匿名类,我不想重复两次。出于某种原因,我遗漏了明显的 (?) 重构为方法调用,而是使用了循环中的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 2019-07-15
        • 2013-12-09
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        相关资源
        最近更新 更多