Это - стилистический вопрос. Я хочу циклично выполниться дважды с переменной 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);
}
}
}
Поскольку это две строки, я бы просто пропустил цикл и сделал:
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 более четко указывает, что происходит.
Дело не только в цикле, мне также очень неудобно использовать булевы таким образом.
Как насчет чего-то вроде:
ActionListener myListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
doStuffLaterBasedOnABooleanFlag(event.getSource() == onButton);
}
};
onButton.addActionListener(myListener);
offButton.addActionListener(myListener);
Это все еще оставляет булево в слушателе, но без знания того, что делает метод doStuffLater, это все, на что мы можем пойти.
Если вы действительно хотите использовать цикл, я бы выбрал вариант (a). Несмотря на новизну, он также понятен и эффективен. Я мог бы переместить массив boolean в private static, чтобы не создавать его каждый раз заново.
Но ответ Брендана мне нравится больше.