РЕДАКТИРОВАТЬ: Если я правильно интерпретирую ваши комментарии, это звучит так, как будто вы на самом деле хотите что-то вроде:
Result result = calculateFoo();
if (result != null) {
return result;
}
result = calculateBar();
if (result != null) {
return result;
}
return calculateBaz();
... где каждый из методов calculate
возвращаетnull
, если соответствующий метод has
возвращает false.Теперь, если null
является действительным «реальным» возвращаемым значением, вы всегда можете обернуть результат так, чтобы calculateFoo
возвращало значение, которое может в основном сказать: «Да, у меня есть действительное значение, и это X» или «нет»., У меня нет действительного значения "(тип" возможно ").
Оригинальный ответ
Я бы сохранил ваш код в точности так, как он есть,Я не вижу проблем с наличием нескольких операторов return, когда это самый ясный подход - и в этом случае я считаю, что это так.
Вы ясно даете понять, что, как только вы дойдете до каждой из «листовых» частей,вы точно знаете, что является возвращаемым значением, и единственный другой код, который должен быть выполнен перед выходом из метода, - это любой код очистки в finally
блоках.
Наличие единой точки выхода имеет смысл в языках, которыене имею try / finally или GC (где вы действительно хотите убедиться, что вы делаете всю очистку в одном месте), но в Java, я думаю, что возвращение, когда вы знаете результат, выражает ваше намерение более четко, чем использование отдельной локальной переменной.
Сказав это, еще одной альтернативой рассмотрим использование условного оператора, раскладывающего ваш код, так что он, очевидно, проходит серию тестов и возвращает, как только обнаружит первый "match ":
return hasFoo() ? getFoo()
: hasBar() ? getBar()
: getBaz();
Недостатком является то, что этот шаблон выглядит немного странно в первый разВы видите это - но как только вы привыкнете к этому, я нахожу это действительно изящным способом кодирования такой логики.