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