Либо вы делаете это с помощью оператора if или переключателя, либо вы просто каким-то образом внедрили соответствующую логику в ErrorCode.
В ОО-режиме все зависит от того, как вы хотите, чтобы приложение или система реагировали на код ошибки. Допустим, вы просто хотите, чтобы он выводил некое диалоговое окно:
public doSomethingWithError() {
ErrorCodes e = getError();
// the source of error, or originator, returns the enum
switch(e) {
case ErrorCodes.INVALID_LOGIN:
prompt('Invalid Login');
case ErrorCodes.INVALID_PASSWORD:
prompt('Invalid password');
// and so on
}
}
Вместо этого мы могли бы создать класс ErrorHandler, который делает это вместо:
// We'll implement this using OO instead
public doSomethingWithError() {
ErrorHandler e = getError();
// the originator now returns an ErrorHandler object instead
e.handleMessage();
}
// We will need the following abstract class:
public abstract class ErrorHandler {
// Lets say we have a prompter class that prompts the message
private Prompter prompter = new Prompter();
public final void handleMessage() {
String message = this.getMessage();
prompter.prompt(message);
}
// This needs to be implemented in subclasses because
// handleMessage() method is using it.
public abstract String getMessage();
}
// And you'll have the following implementations, e.g.
// for invalid logins:
public final class InvalidLoginHandler() {
public final String getMessage() {
return "Invalid login";
}
}
// E.g. for invalid password:
public final class InvalidPasswordHandler() {
public final String getMessage() {
return "Invalid password";
}
}
Прежнее решение легко реализовать, но его становится сложно поддерживать по мере увеличения кода. Последнее решение является более сложным (aka. Шаблонный шаблон по принципу Open-Closed ), но позволяет вам добавлять дополнительные методы в ErrorHandler
, когда вам это нужно (например, как восстановление ресурсов или что-то еще). Вы также можете реализовать это с помощью шаблона стратегии .
Вы не сможете полностью избавиться от условных операторов, но в последнем случае условное выражение будет добавлено в ту часть кода, где возникла ошибка. Таким образом, у вас не будет двойного обслуживания условных операторов как у инициатора, так и у кода обработки ошибок.
EDIT:
См. этот ответ Майкла Боргвардта и этот ответ Оксайта о том, как реализовать методы в перечислениях Java, если вы хотите сделать это вместо этого.