好的,让我们从一些可能性开始:
如果您将来只添加一些消息并且只在新版本中这样做,那么将消息存储在枚举中将是一个可行的选择:
enum ErrorMessage {
SOME_MESSAGE("something, bla bla"),
SOME_OTHER_MESSAGE("something_else"),
...;
private String message;
private ErrorMessage(String message) {
this.message = message;
}
public static ErrorMessage getByErrorMessage(String message) {
for(ErrorMessage errorMessage: message) {
if (errorMessage.message.equals(message)) {
return errorMessage;
}
}
return null;
}
public static boolean exists(String message) {
return getByErrorMessage(message) != null;
}
}
请注意,这个版本非常原始,可以通过将所有消息添加到静态 Set 中来改进:
static Set<String> messagesCache = new Hashset<String>();
//in constructor:
messagesCache.add( message );
// better exists() method:
public static boolean exists(String message) {
return messagesCache.contains(message);
}
或者,与其他解决方案一样,您只能存储字符串的实际哈希码。哈希码是您的字符串的简单数字表示,并且足够独特,您可以识别它。与上述相同的解决方案:
static Set<String> messagesHashCodes = new Hashset<String>();
//in constructor:
messagesHashCodes .add( message.hashCode() );
// better exists() method:
public static boolean exists(String message) {
return messagesHashCodes .contains(message.hashCode());
}
(当然,检查空值等是个好主意)
枚举版本有一个很大的优势,如果你想对某些动作采取不同的动作,你可以将它们编码到枚举中,例如...
SOME_MESSAGE_REQUIRING_AN_ACTION("...") {
@Override
public void doAction(StringBuilder finalString) {
...doSomething.
}
}
...
public void doAction(StringBuilder finalString) {
finalString.append( this.message );
finalString.append( SOME_SEPERATOR );
}
public void static doAction(StringBuilder builder, String errorMessage) {
if (exists(errorMessage)) {
}
}
在此示例中,您可以覆盖每个枚举值中的 doAction 方法,如果它应该执行更多/其他操作而不是将消息附加到 StringBuilder。在枚举列表中添加一些“NULL_MESSAGE”也是一个不错的选择,它什么都不做,只是为了便于处理:
UNKNOWN_MESSAGE(null) {
@Override
public void doAction(StringBuilder finalString) {
// do nothing here
}
}
public static ErrorMessage getByErrorMessage(String message) {
for(ErrorMessage errorMessage: message) {
if (errorMessage.message != null && errorMessage.message.equals(message)) {
return errorMessage;
}
}
return UNKNOWN_MESSAGE;
}
这样,您可以简单地将每个字符串放入您的枚举方法 doAction(StringBuilder, String) 并获得结果:如果一条消息适合,则添加它(并采取其他一些操作),如果不适合,它将是忽略,包括空检查。
另一方面,如果您的消息经常更改,那么您可能不会发布此类更改,而是将值保存在数据库中。在这种情况下,我将使用消息的 hashCode() 作为 id(正如我所说,通常足够独特)并在应用程序启动时将整个内容加载到内存中,例如,允许您再次构建一个 Set哈希码来比较你的errorMessages的哈希码。
protected void init() {
// load all error Messages from the database
// put them into a Map<String, String> (hashCode -> Value) or even just a Set<String> (hashcodes)
}