在 java 中验证对象的最佳方式

Best way to validate an object in java

我是编程新手。我有一个要验证的对象列表(不是短路,而是 运行 每个对象的验证规则列表)。

最初我有一个巨大的 if/else 声明,但它看起来不是很漂亮。我认为这样的事情会更好:

foreach (object: objects) {
  foreach (rule: validationRules) {
    try {
      rule.validate(object)
    } catch {
      // Write to log
      // Increment counter for rule
    }
  }
}

我只是不知道如何创建验证规则。我想使用 Java 8 个谓词,因为我听说这是我应该使用的,但我不确定如何去做。我想我可能会创建一个带有规则的接口,然后是一个定义了每个规则的实现以及规则列表。这听起来是解决这个问题的好方法吗?

谢谢!

你的 for 循环是个好主意。

谓词的想法取决于这是否是一种有用的方法来执行您所说的验证。我通常建议人们在开始解决问题之前不要将自己锁定在特定的 "must use X" 思维方式中。计划使用最简单 and/or 最有效的东西,但专注于特定功能会导致一种 "trying to screw with a hammer" 心态。

谓词不需要循环,但我认为这不是提高性能的好选择,因为如果您使用谓词进行过滤,它们会创建新的对象集合,这是一项潜在的昂贵操作。一个简单的方法规则(如您自己的草图所示)看起来更简单,无论是在概念上还是作为代码维护。

我认为您可以使用 Predicate 来实施您的规则。因为 Predicate 是一个单一的抽象方法,一个简单的 lambda 可以用来实现它,你的验证器可以用 Predicates.

的列表来启动
public final class Validator {
    private final List<Predicate<MyObject>> rules;
    public final Validator(List<Predicate<MyObject>> rules) {
        this.rules = rules;
    }

    public final validate(MyObject object) {
        return rules.stream()
                    .map(Predicate::test)
                    .findAny(Boolean.FALSE).isPresent();
    }
}

您可以使用任何您需要的 lambda 表达式来初始化 class。

接下来的问题是您是要从多个故障中收集故障,一起报告它们,还是只在第一个故障时停止。根据您的情况,那里有许多选项。您可以使用异常或传递某种故障收集器。

我正在考虑使用谓词来验证我项目中的对象,我遇到了这个很棒的 link https://gtrefs.github.io/code/combinator-pattern/ 。 本质上, 仔细阅读教程后,我修改了很多我编写的代码部分。首先,正确使用谓词可以使 SRP 脱颖而出,这绝对是前进的方向。我已经使用对象的谓词编写了一个简单的验证器并将其发布在 https://github.com/Raveesh/QuickProgramsForFun/tree/master/javaValidators 或许对你有用