Общий метод для обработки переменных форматов строк? - PullRequest
0 голосов
/ 26 июня 2010

У меня есть серия сообщений об исключениях:

enum myEnum {
    BASIC(1, "An error occurred"),
    WITH_ERRORID(2, "Error id: {0}"),
    DETAILED(3, "Problem in record {0} with index {1}");
};

У меня также есть одно, многократно используемое разрешение для регистрации и создания пользовательского исключения:

public void throwException (myEnum message) {
    log.addEntry(message);
    throw new CustomException(message);
}

Вызов метода прямойвперед:

throwException (myEnum.DETAILED);

Сейчас я борюсь с самым элегантным способом форматирования строк.Я мог бы добавить метод toString () в перечисление, чтобы отформатировать строку на основе количества входных данных, и изменить throwException, чтобы принимать вместо него строку:

String msg = message.toString(variable);
throwException (msg);

String msg2 = message.toString(variable, otherVariable);
throwException (msg2);

String msg3 = message.toString(variable, otherVariable, nextVariable);
throwException (msg3);

Хотя это будет работать, я хотел бы переместитьповторные вызовы toString с точностью до throwException ().Я думал о передаче ArrayList для throwException ().Но тогда мне придется проверить размер списка, прежде чем я отформатирую строку:

if (list.size == 1) MessageFormat.format(message, list.get(0));
if (list.size == 2) MessageFormat.format(message, list.get(0), list.get(1));

Является ли лучший технический или конструктивный подход для решения этой проблемы?

1 Ответ

2 голосов
/ 27 июня 2010

Поскольку вы используете объявление типа enum, я собираюсь предположить, что вы используете JSE 5 или более позднюю версию.

Учитывая это, я бы сказал, что вы большую часть пути крешение.Вот моя версия вашего перечисления:

public enum myEnum {
    BASIC(1, "An error occurred"),
    WITH_ERRORID(2, "Error id: {0}"),
    DETAILED(3, "Problem in record {0} with index {1}");
    private int key = 0;
    private String format = null;

    private myEnum(int aKey, String aFormat) {
        this.key=aKey;
        this.format=aFormat;
    }

    /**
     * This will take whatever input you provide and use the enum instance format
     * string to generate a message.
     */
    public String getMessage(Object... someContents) {
        return MessageFormat.format(this.format, someContents);
    }
}

Чтобы использовать эти модификации, вам нужно внести одно небольшое изменение в вашу реализацию throwException ():

public void throwException (myEnum message, String... errorContents) {
    String formattedMessage = message.getMessage(errorContents);
    log.addEntry(formattedMessage);
    throw new CustomException(formattedMessage);
}

Использование нотации varargs означает, чтоВы можете передать ноль или более значений одного и того же типа, и они будут рассматриваться как массив в вызываемом коде.Нет аргументов?Он обрабатывается как массив нулевой длины, и форматирование не выполняется.

Единственная оставшаяся трудность состоит в том, что я не вижу никакого очевидного способа предупредить разработчика во время компиляции, что для заполнения требуется больше аргументовформатирование.Если вы не передадите подробности об ошибке с myEnum.DETAILED, вы вернетесь к формату, с которого начали.

У вас уже должны быть строки, необходимые для вставки в ваши форматы;теперь вам просто нужно передать их методу throwException ().Как это выглядит как вариант?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...