我有一个枚举,根据枚举类型评估字符串是否有效。使用开关执行验证。默认操作是这样的:
default: return false;
。
程序员添加了一个新类型并忘记更新isValid(..)
,导致每次评估答案时调用isValid(..)
都会返回false。
您认为处理它的正确方法是什么?
public enum AnswerType {
TEXT("string"),
INT("integer"),
FLOAT("float");
final String type;
AnswerType(final String type) {
this.type = type;
}
/**
* Checks whether the given answer is valid for this answer type.
* @param answer The provided answer.
* @return true if the answer is valid; false otherwise.
*/
public boolean isValid(final String answer) {
switch (this) {
case TEXT:
return !StringUtils.isEmpty(answer);
case INT:
return NumberUtils.isDigits(answer);
case FLOAT:
return NumberUtils.isNumber(answer);
default:
return false; // Not sure this is best practise.
}
}
}
答案 0 :(得分:9)
这是一个奇怪的设计(默认情况下你的代码不能达到)...为什么不把这个方法放在每个枚举常量中呢?
public static enum AnswerType {
TEXT("string") {
public boolean isValid(String answer) { return !StringUtils.isEmpty(answer); }
},
INT("integer") {
public boolean isValid(String answer) { return NumberUtils.isDigits(answer); }
},
FLOAT("float") {
public boolean isValid(String answer) { return NumberUtils.isNumber(answer); }
};
private final String type;
AnswerType(final String type) {
this.type = type;
}
/**
* Checks whether the given answer is valid for this answer type.
*
* @param answer The provided answer.
*
* @return true if the answer is valid; false otherwise.
*/
public abstract boolean isValid(final String answer);
}
或者,如果您使用Java 8,则可以进一步简化代码:
public static enum AnswerType {
TEXT("string", s -> !StringUtils.isEmpty(s)),
INT("integer", NumberUtils::isDigits),
FLOAT("float", NumberUtils::isNumber);
private final String type;
private final Predicate<String> isValid;
AnswerType(final String type, Predicate<String> isValid) {
this.type = type;
this.isValid = isValid;
}
/**
* Checks whether the given answer is valid for this answer type.
*
* @param answer The provided answer.
*
* @return true if the answer is valid; false otherwise.
*/
public boolean isValid(final String answer) {
return isValid.test(answer);
}
}
答案 1 :(得分:0)
如果需要随时间添加答案类型,为什么要使用枚举?您可以使用Answer
方法创建isValid
界面,然后在StringAnswer
,IntegerAnswer
等中实施。然后当有人想要添加答案类型时,他们就不会修改现有代码。