处理变量字符串格式的通用方法?

时间:2010-06-26 19:41:36

标签: java

我有一系列异常消息:

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:

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 个答案:

答案 0 :(得分:2)

由于您正在使用枚举类型声明,我将假设您使用的是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()方法。这看起来如何?