Подтвердить что ты не робот

Лучшая практика для возврата нескольких значений в Java?

Сегодня я добавил дополнительную проверку безопасности за моими регистрационными формами, чтобы замедлить атаки грубой силы. У меня есть несколько форм для входа и сделана хорошая функция быстрого вызова, которая выполняет всю проверку, а затем возвращает результат.

public static ValidateLoginResult validateLogin(HttpServletRequest request, String email, String password) {

Проблема заключается в том, что результат не является единственным значением, результат состоит из:

boolean ok
String errorMessage
boolean displayCaptcha

Для этого я создал новый класс. Все это прекрасно работает.

Но у меня часто есть полезные функции утилиты, которые возвращают несколько значений и начинают находить это немного раздражающим, чтобы каждый раз создавать новый класс для результата.

Есть ли лучший способ возврата нескольких значений? Или я просто ленив?:)

4b9b3361

Ответ 1

Нет, такая структура не существует на самом деле в Java, но вы можете посмотреть библиотеку JavaTuples, которая может удовлетворить ваши потребности и предоставить довольно элегантное решение. Используя Triplet<Boolean, String, Boolean>

Ответ 2

Вы можете определить класс 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" ).

Кроме того, да, вы ленитесь - пользовательские кланы всегда будут более самодокументируемыми, чем пары и тройки.

Ответ 3

Не уверен в "лучшей практике", но прагматичный вариант - вернуть Map<String, String>? Например.

myMap.put("result", "success");
myMap.put("usernameConfirmed", "bigTom");

return myMap;

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

В качестве альтернативы вы можете использовать Map<String, Object> и быть более строгим с проверкой типов хранимых объектов: Строки, Булевы, Даты и т.д.

Ответ 4

Я не могу думать о более чистом и объектно-ориентированном способе возврата нескольких значений из функции, чем их инкапсуляция в классе.

В идеале, несколько значений, которые вы хотите вернуть, концептуально являются частью одного и того же класса, поэтому имеет смысл группировать их таким образом; если они этого не делают, то вы, вероятно, должны разложить свою функцию в некоторых более мелких функциях, которые возвращают каждое из значений, которые вам нужны вне самой функции.

Насколько я могу судить, некоторые IDE также имеют возможности для инкапсуляции нескольких значений в класс: например, Eclipse имеет Refactor --> Extract class...

Ответ 5

Вы можете вернуть массив Object [], java autoboxes, чтобы он был более простым в использовании. Если это просто для передачи на короткое расстояние, почему бы и нет. Ofc его рискованные, возможные проблемы с заданием класса, nullchecks и т.д.

но его легко написать и использовать.

то снова создается статический внутренний класс, и если вы поместите его прямо рядом с возвращаемым им методом, вы также знаете, где его найти (обычно около начала)

Ответ 6

Я бы, скорее всего, просто пошел по маршруту класса, но в зависимости от того, что вы хотите вернуть функции, вы можете уйти с возвратом какого-то контейнера значений.