Заранее спасибо, что прочитали мой вопрос.
Есть ли способ рефакторить код ниже?
Приведенный ниже код предназначен для обработки ошибок в моем проекте.
Я не использовал коды if-else и изменил имена переменных, чтобы упростить свой вопрос. В оригинале больше кодов if-else и переменных.
private static final String NUMBER_ONE = "number.one";
private static final String NUMBER_TWO = "number.two";
private static final String NUMBER_THREE = "number.three";
private static final String NUMBER_FOUR = "number.four";
private static final String NUMBER_FIVE = "number.five";
// ... more error names
public void handler(ApiException exception, String customerNo, String code) {
if (is(NUMBER_ONE, exception)) {
throw new NumberOneException(customerNo, code);
} else if (is(NUMBER_TWO, exception)) {
throw new NumberTwoException(customerNo);
} else if (is(NUMBER_THREE, exception)) {
throw new NumberThreeException(code);
} else if (is(NUMBER_FOUR, exception)) {
throw new NumberFourException(customerNo, exception.toError());
} else if (is(NUMBER_FIVE, exception)) {
throw new NumberFiveException(exception.toError());
// ... too many if-else sentences :-(
}
private boolean is(String errorCode, ApiException exception) {
return StringUtils.equals(errorCode, exception.getCode());
}
Я думал либо о Enum, либо о HashMap, но не смог применить ни один из них.
Основная причина заключалась в том, что каждое исключение требует разных параметров друг для друга.
Я все еще думаю об использовании HashMap, но не уверен, эффективно это или нет.
Как сказал davidalayachew, у вас поменялись местами параметры. Кроме того, есть стандартный метод equals, который вы можете вызывать для каждого String. Нет необходимости вызывать внешнюю библиотечную функцию, например StringUtils.equals. И когда вы используете стандартную String функциональность сопоставления, вы можете просто использовать switch(exception.getCode()) { case NUMBER_ONE: throw new NumberOneException(customerNo, code); case NUMBER_TWO: … etc Вы также можете создать фабричный интерфейс для своих исключений и использовать карту из строки в фабрику, однако инициализация карты не короче, чем оператор switch.
Привет @davidalayachew, Спасибо за ваш отзыв. Я исправил is правильно.
Спасибо за ответ @Holger. Похоже, что использование переключателя будет короче исходного кода, как вы упомянули.




Взгляните на паттерн Factory method, который кажется наиболее подходящим в представленном случае.
Ваш код не имеет смысла. У вас есть метод
is, который принимает 2 параметра(ApiException, String). Однако во всех примерах это так:is(NUMBER_ONE, exception), гдеNUMBER_ONE— этоString. Ты хотел обратить это вспять?