Ответ 1
Нет, такая структура не существует на самом деле в Java, но вы можете посмотреть библиотеку JavaTuples, которая может удовлетворить ваши потребности и предоставить довольно элегантное решение. Используя Triplet<Boolean, String, Boolean>
Сегодня я добавил дополнительную проверку безопасности за моими регистрационными формами, чтобы замедлить атаки грубой силы. У меня есть несколько форм для входа и сделана хорошая функция быстрого вызова, которая выполняет всю проверку, а затем возвращает результат.
public static ValidateLoginResult validateLogin(HttpServletRequest request, String email, String password) {
Проблема заключается в том, что результат не является единственным значением, результат состоит из:
boolean ok
String errorMessage
boolean displayCaptcha
Для этого я создал новый класс. Все это прекрасно работает.
Но у меня часто есть полезные функции утилиты, которые возвращают несколько значений и начинают находить это немного раздражающим, чтобы каждый раз создавать новый класс для результата.
Есть ли лучший способ возврата нескольких значений? Или я просто ленив?:)
Нет, такая структура не существует на самом деле в Java, но вы можете посмотреть библиотеку JavaTuples, которая может удовлетворить ваши потребности и предоставить довольно элегантное решение. Используя Triplet<Boolean, String, Boolean>
Вы можете определить класс Pair<A, B>
и Triplet<A, B, C>
, и это решит проблему возврата значений 2 и 3 при обеспечении безопасности типов. В этом конкретном случае подпись может быть
public static boolean validateLogin(HttpServletRequest request,
String email, String password, Pair<Message, Boolean> outputIfOk);
Или даже лучше, в контексте сервлета может иметь смысл установить некоторые хорошо документированные атрибуты запроса.
Если вы часто нуждаетесь в специальных классах, чтобы возвращать результаты, вы можете, скорее всего, реорганизовать эти кланы для совместного использования общего предка (скажем, иметь RequestStatus, который включает поля "ok" и "message" ).
Кроме того, да, вы ленитесь - пользовательские кланы всегда будут более самодокументируемыми, чем пары и тройки.
Не уверен в "лучшей практике", но прагматичный вариант - вернуть Map<String, String>
? Например.
myMap.put("result", "success");
myMap.put("usernameConfirmed", "bigTom");
return myMap;
Вероятно, летит перед лицом миллионов принципов OO, но я слышал, что вы хотите избежать распространения классов результатов.
В качестве альтернативы вы можете использовать Map<String, Object>
и быть более строгим с проверкой типов хранимых объектов: Строки, Булевы, Даты и т.д.
Я не могу думать о более чистом и объектно-ориентированном способе возврата нескольких значений из функции, чем их инкапсуляция в классе.
В идеале, несколько значений, которые вы хотите вернуть, концептуально являются частью одного и того же класса, поэтому имеет смысл группировать их таким образом; если они этого не делают, то вы, вероятно, должны разложить свою функцию в некоторых более мелких функциях, которые возвращают каждое из значений, которые вам нужны вне самой функции.
Насколько я могу судить, некоторые IDE также имеют возможности для инкапсуляции нескольких значений в класс: например, Eclipse имеет Refactor --> Extract class...
Вы можете вернуть массив Object [], java autoboxes, чтобы он был более простым в использовании. Если это просто для передачи на короткое расстояние, почему бы и нет. Ofc его рискованные, возможные проблемы с заданием класса, nullchecks и т.д.
но его легко написать и использовать.
то снова создается статический внутренний класс, и если вы поместите его прямо рядом с возвращаемым им методом, вы также знаете, где его найти (обычно около начала)
Я бы, скорее всего, просто пошел по маршруту класса, но в зависимости от того, что вы хотите вернуть функции, вы можете уйти с возвратом какого-то контейнера значений.