我想用Java编写一个方法来验证某些条件是否存在某些数据,并确认数据有效或产生适当的错误消息.
问题是我们不能从一个方法返回多个东西,所以我想知道最佳解决方案是什么(在可读性和可维护性方面).
第一解决方案 很容易,但我们无法知道究竟是什么使检查失败:
boolean verifyLimits1(Set<Integer> values, int maxValue) {
for (Integer value : values) {
if (value > maxValue) {
return false; // Out of limits
}
}
return true; // All values are OK
}
Run Code Online (Sandbox Code Playgroud)
二解决方案.我们有消息,但我们正在以一种我们不应该使用的方式使用异常(此外,它应该是特定于域的已检查异常,过多的开销IMO):
void verifyLimits2(Set<Integer> values, int maxValue) {
for (Integer value : values) {
if (value > maxValue) {
throw new IllegalArgumentException("The value " + value + " exceeds the maximum value");
}
}
}
Run Code Online (Sandbox Code Playgroud)
第三种方案.我们有一个详细的消息,但合同不干净:我们让客户端检查String是否为空(他需要读取javadoc).
String verifyLimits3(Set<Integer> values, int maxValue) {
StringBuilder builder = new StringBuilder();
for (Integer value : values) {
if (value > maxValue) {
builder.append("The value " + value + " exceeds the maximum value/n");
}
}
return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)
你会推荐哪种解决方案?或者有一个更好的(希望!)?
(注意:我编写了这个小例子,我的实际用例涉及异构数据的复杂条件,所以不要专注于这个具体的例子并建议Collections.max(values) > maxValue ? "Out of range." : "All fine.":-).)
如果您需要多个值,则应返回一个简单的类实例.以下是我们在某些情况下使用的示例:
public class Validation {
private String text = null;
private ValidationType type = ValidationType.OK;
public Validation(String text, ValidationType type) {
super();
this.text = text;
this.type = type;
}
public String getText() {
return text;
}
public ValidationType getType() {
return type;
}
}
Run Code Online (Sandbox Code Playgroud)
这对类型使用简单的枚举:
public enum ValidationType {
OK, HINT, ERROR;
}
Run Code Online (Sandbox Code Playgroud)
验证器方法可能如下所示:
public Validation validateSomething() {
if (condition) {
return new Validation("msg.key", ValidationType.ERROR);
}
return new Validation(null, ValidationType.OK);
}
Run Code Online (Sandbox Code Playgroud)
而已.
解决方案很简单:创建自定义VerificationResult类.它可以有一个boolean status标志和一个String message字段,以及您可能想要添加的其他内容.而不是返回a String或a boolean,返回a VerificationResult.
此外,根据上下文,抛出异常实际上可能最终成为正确的事情.不过,必须根据具体情况逐案考虑.
您可以使用的另一个选项是让验证返回a boolean,并且具有单独的方法,例如String whatWentWrongLastTime()用户可以在false返回的情况下进行查询.您必须非常小心可能会覆盖"最后"验证错误的任何并发问题等.
这是如所采取的做法java.util.Scanner,这不不抛出任何IOException(除了构造函数).要查询某些内容是否"出错",您可以查询其ioException()方法,该方法返回最后一个IOException,或者null如果没有,则查询.
| 归档时间: |
|
| 查看次数: |
2008 次 |
| 最近记录: |