Java: цикличное выполнение на этих двух булевых значениях (ложь, верная)

Это - стилистический вопрос. Я хочу циклично выполниться дважды с переменной on который имеет значение false, затем к истинному. Какой из них более ясен:

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) что-то еще


править: Закон Murphy's непреднамеренных интерпретаций начинает действовать... вариант использования, я первоначально выглядел примерно так вместо 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);
      }
   }
}
14
задан Jason S 4 March 2010 в 22:56
поделиться

4 ответа

Поскольку это две строки, я бы просто пропустил цикл и сделал:

doStuffBasedOnABooleanFlag(false);
doStuffBasedOnABooleanFlag(true);

Меньше кода, больше очевидности, больше эффективности.

23
ответ дан 1 December 2019 в 07:19
поделиться

Другой вариант - избежать логического значения и использовать перечисление:

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

Затем вы можете выполнить итерацию:

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

Или выполняйте вызовы напрямую:

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

Преимущество этого состоит в том, что API более четко указывает, что происходит.

11
ответ дан 1 December 2019 в 07:19
поделиться

Дело не только в цикле, мне также очень неудобно использовать булевы таким образом.

Как насчет чего-то вроде:

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

Это все еще оставляет булево в слушателе, но без знания того, что делает метод doStuffLater, это все, на что мы можем пойти.

0
ответ дан 1 December 2019 в 07:19
поделиться

Если вы действительно хотите использовать цикл, я бы выбрал вариант (a). Несмотря на новизну, он также понятен и эффективен. Я мог бы переместить массив boolean в private static, чтобы не создавать его каждый раз заново.

Но ответ Брендана мне нравится больше.

3
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: