Код плох не только потому, что магические числа , но и потому, что он объединяет несколько значений в коде возврата, скрывая в своем значении ошибку, предупреждение, разрешение на создание сеанса или комбинацию из трех, что делает его плохой вклад для принятия решений.
Я бы предложил следующий рефакторинг: возвращение перечисления с возможными результатами (как предложено в других ответах), но добавление в перечисление атрибута, указывающего, является ли это отказом, отказом (я позволю вам пройти этот последний раз) или если все в порядке (PASS):
public LoginResult processLogin(HttpServletRequest request, HttpServletResponse response,
int pwChangeDays, ServletContext ServContext) {
}
==> LoginResult.java <==
public enum LoginResult {
NOT_LOGGED_IN(Severity.DENIAL),
ALREADY_LOGGED_IN(Severity.PASS),
INACTIVE_USER(Severity.DENIAL),
VALID_USER(Severity.PASS),
NEEDS_PASSWORD_CHANGE(Severity.WAIVER),
INVALID_APP_USER(Severity.DENIAL),
INVALID_NETWORK_USER(Severity.DENIAL),
NON_APPROVED_ADDRESS(Severity.DENIAL),
ACCOUNT_LOCKED(Severity.DENIAL),
ACCOUNT_WILL_BE_LOCKED(Severity.WAIVER);
private Severity severity;
private LoginResult(Severity severity) {
this.severity = severity;
}
public Severity getSeverity() {
return this.severity;
}
}
==> Severity.java <==
public enum Severity {
PASS,
WAIVER,
DENIAL;
}
==> Test.java <==
public class Test {
public static void main(String[] args) {
for (LoginResult r: LoginResult.values()){
System.out.println(r + " " +r.getSeverity());
}
}
}
Выходные данные для Test.java, показывающие серьезность для каждого LoginResult:
NOT_LOGGED_IN : DENIAL
ALREADY_LOGGED_IN : PASS
INACTIVE_USER : DENIAL
VALID_USER : PASS
NEEDS_PASSWORD_CHANGE : WAIVER
INVALID_APP_USER : DENIAL
INVALID_NETWORK_USER : DENIAL
NON_APPROVED_ADDRESS : DENIAL
ACCOUNT_LOCKED : DENIAL
ACCOUNT_WILL_BE_LOCKED : WAIVER
На основании значения перечисления и его серьезности вы можете решить, будет ли создание сеанса продолжаться или нет.
РЕДАКТИРОВАТЬ:
В ответ на комментарий @ T.Sar я изменил возможные значения серьезности на PASS, WAIVER и DENIAL вместо (OK, WARNING и ERROR). Таким образом, становится ясно, что DENIAL (ранее ERROR) сама по себе не является ошибкой и не обязательно должна приводить к выбрасыванию исключения. Вызывающий объект проверяет объект и решает, выдавать или нет исключение, но DENIAL - это действительный статус результата, полученный в результате вызова processLogin(...)
.
- ПРОЙДИТЕ: создайте сеанс, если он еще не существует
- ОТКАЗ ОТ ОТВЕТА: на этот раз, но в следующий раз пользователь может не пройти
- ОТКАЗ: извините, пользователь не может пройти, не создавать сеанс