在 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 可以用来实现它,你的验证器可以用 Predicate
s.
的列表来启动
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
或许对你有用
我是编程新手。我有一个要验证的对象列表(不是短路,而是 运行 每个对象的验证规则列表)。
最初我有一个巨大的 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 可以用来实现它,你的验证器可以用 Predicate
s.
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 或许对你有用