gpt4 book ai didi

java - 处理可变字符串格式的通用方法?

转载 作者:行者123 更新时间:2023-12-02 08:31:55 27 4
gpt4 key购买 nike

我有一系列异常消息:

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));

有更好的技术或设计方法来解决这个问题吗?

最佳答案

由于您使用的是枚举类型声明,我将假设您使用的是 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);
}

使用可变参数表示法意味着您可以传递零个或多个相同类型的值,并且它们在调用的代码中被视为数组。没有争论吗?它被视为零长度数组,并且不会发生格式化。

剩下的唯一困难是我看不到任何明显的方法来在编译时提醒开发人员需要更多参数来填写格式。如果您没有通过 myEnum.DETAILED 传递任何错误详细信息,您将返回开始时使用的格式。

您应该已经拥有注入(inject)格式所需的字符串;现在您只需将它们传递给 throwException() 方法即可。这看起来如何?

关于java - 处理可变字符串格式的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com