我想用 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
}
第二种解决方案。我们收到消息,但我们正在以不应该的方式使用异常(此外,它可能应该是特定于域的检查异常,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");
}
}
}
第三种解决方案。我们有一个详细的消息,但契约(Contract)并不干净:我们让客户检查字符串是否为空(为此他需要阅读 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();
}
您会推荐哪种解决方案?还是有更好的(希望如此!)?
(注意:我编造了这个小例子,我的真实用例涉及异构数据的复杂条件,所以不要关注这个具体的例子并提出 Collections.max(values) > maxValue ? "Out of范围。”:“一切都很好。”
:-).)
最佳答案
如果您需要多个值,您应该返回一个简单的类实例。以下是我们在某些情况下使用的示例:
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;
}
}
这对类型使用了一个简单的枚举:
public enum ValidationType {
OK, HINT, ERROR;
}
validator 方法可能如下所示:
public Validation validateSomething() {
if (condition) {
return new Validation("msg.key", ValidationType.ERROR);
}
return new Validation(null, ValidationType.OK);
}
就是这样。
关于java - 如何在 Java 中返回标志和可选消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546062/