这是一个风格问题。我想用变量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);
}
}
}
答案 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);
});