java - 如何在 Java 中返回标志和可选消息?

标签 java readability

我想用 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/

相关文章:

c# - 如何让我的代码更容易让下一个开发人员理解?

language-agnostic - 生成的代码是否需要人类可读?

jquery - 我可以通过像在 CSS 中那样对它们进行分组来将相同的样式应用于 jQuery 中的两个元素吗?

c# - 提高简短片段的可读性,同时让 StyleCop 满意

java - jsp中的oracle连接

java - Android 如何在计划后更改 TimerTask 间隔?

Java mysql 结果集错误

Java:值在不应该更新的时候更新

java - JMock奇怪的try/catch子句

javascript - 在javascript中,相同的代码解析不同函数中的参数 - 复制或不复制?