【问题标题】:Best way to validate an object in java在java中验证对象的最佳方法
【发布时间】:2017-08-31 17:32:28
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: java validation java-8 validationrules


    【解决方案1】:

    我认为您可以使用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();
        }
    }
    

    你可以用任何你需要的 lambdas 来初始化这个类。

    接下来的问题是,您是想从多个故障中收集故障,将它们全部报告,还是仅仅在第一次故障时停止。根据您的情况,有多种选择。您可以使用异常或传递某种故障收集器。

    【讨论】:

    • 谢谢!我想通过记录它们然后增加该失败的计数器来报告多个失败。有没有比其他方法更好的方法?
    • 我将使用简单的 for 循环,因为它似乎可以满足我的需求,并且美观且易读。我会赞成你的回答,但我还没有足够的声誉!
    【解决方案2】:

    我正在考虑使用谓词来验证我的项目中的对象,我遇到了这个精彩的链接https://gtrefs.github.io/code/combinator-pattern/。 本质上, 在密切关注教程之后,我重新更改了我编写的代码的很多部分。首先,正确使用谓词使 SRP 脱颖而出,这绝对是前进的方向。我编写了一个使用对象谓词的简单验证器,并将其发布在https://github.com/Raveesh/QuickProgramsForFun/tree/master/javaValidators 或许对你有用

    【讨论】:

      【解决方案3】:

      你的 for 循环是个好主意。

      谓词的想法取决于这是否是一种有用的方法来执行您所说的验证。我通常建议人们在开始解决问题之前不要将自己锁定在特定的“必须使用 X”的思维方式中。计划使用最简单和/或最有效的任何东西,但专注于特定功能会导致一种“试图用锤子搞砸”的心态。

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

      【讨论】:

      • 有没有更好的方法来使用 Java 8 风格的函数式编程来编写这个循环?
      • 我有点老派,经验告诉我代码需要清晰和简单(KISS principle)。这有助于可维护性和错误修复。所以我认为你直接的 for 循环和规则方法是一个更好的选择。我也不认为任何其他方法会更有效。
      • 太好了,那我就去吧。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多