[英]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.