#java #while-loop
#java #цикл while
Вопрос:
Допустим, у нас есть цикл java while с большим количеством операторов continue:
while (...)
{
// code A...
continue;
// code B...
continue;
// code C...
continue;
code D...
}
Что, если нам нужно запускать один и тот же код перед каждым continue
? т.е. код A, B и C выше все одинаковы. Как бы вы избежали дублирования кода?
Я пытаюсь избежать дублирования кода, не «вставляя» этот код перед каждым продолжением;
Комментарии:
1. Ваш скелет кода, как указано выше, может быть слишком расплывчатым, чтобы кто-либо мог дать точный ответ. Можете ли вы показать нам фактический код?
2. Вы пробовали операторы if? Я обычно избегаю продолжения и пытаюсь позволить следующей итерации выполняться естественным потоком выполнения.
3. Вы можете переместить этот код в функцию и вызвать эту функцию перед продолжением
4. Таким образом, вы пытаетесь избежать дублирования кода, не записывая этот код перед каждым
continue;
. Я правильно понял?5. Если бы это был я, я бы переместил все содержимое цикла в другой метод и заменил каждый
continue
наreturn
. Возможно, ваш повторяющийся шаблон может остаться в исходном цикле.
Ответ №1:
Один из способов — использовать try...finally
блок. Допустим, ваш исходный код выглядит следующим образом:
while(...) {
if (condition1) {
duplicatedCode();
continue;
}
...
if (condition2) {
duplicatedCode();
continue;
}
...
if (condition3) {
duplicatedCode();
continue;
}
otherCode();
}
Вы можете уменьшить дублирование следующим образом:
while(...) {
boolean shouldRun = true;
try {
if (condition1) {
continue;
}
...
if (condition2) {
continue;
}
...
if (condition3) {
continue;
}
otherCode();
shouldRun = false;
} finally {
if (shouldRun)
duplicatedCode();
}
}
Хотя я не уверен, что это лучше для чтения…
Комментарии:
1. Я не думаю, что это что-то добавляет к удобочитаемости кода; но я ценю ваше сотрудничество.
2. @Joseph_Marzbani Ну, вы не всегда можете съесть пирог и съесть его: ( Меньше дублирования кода или больше удобочитаемости? Зависит от того, какой из них вы считаете более важным. Я бы выбрал последнее. Давайте подождем и посмотрим, придумает ли кто-нибудь еще лучшее решение.
3. Я думаю, вы правы. Здесь будет работать некоторый оператор ‘goto’; но мы знаем, что это не вариант в Java
Ответ №2:
Вместо использования continue вы можете использовать оператор цикла, если условия аналогичны
while(...)
{
...
continue;
...
continue;
...
}
измените его на
for(....) {
if(...)
continue;
if(...)
continue;
}