簡體   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