我有要执行的“用户”验证的列表,每个验证都实现谓词(来自Guava)。我有以下方法填充要执行的验证列表并创建所有验证的组合谓词。
List<Validation> validations = new ArrayList();
Predicate<User> composedUserValidations;
private void setupValidations() {
validations.add(userEmailIsValid());
validations.add(userPhoneIsValid());
validations.add(userLoginIsValid());
.....
//creating composite
composedUserValidations = and(validations);
}
问题:当我触发对ApplyedUserValidations的应用并且其中之一将失败时,是否有办法找到确切的哪个失败。现在我有:
public boolean isUserValid(User user) {
if (!composedUserValidations.apply(user)) {
return false;
}
}
而且我想拥有类似的东西:
public void validateUser(User user) {
if (!composedUserValidations.apply(ticket)) {
throw new ValidationExcepction("Predicate which failed");
}
}
什么是最好的方法?
您可以为User
类设计一个构建器,我们将其命名为UserBuilder
。
对于构建器类中User
的每个属性(登录,电子邮件,电话),您不仅可以提供想要为User
实例设置的值,还可以提供Predicate
,您可以立即申请。如果任何谓词失败,则可以轻松引发Exception和/或输出消息,等等。
对于您创建的所有实例,您可以选择传递不同的验证规则,也可以另外设计构建器以跳过对User
字段中任何一个的验证。
示例:
public class UserBuilder {
private String phone;
private String email;
//add more properties here;
public void phone(String phone, Predicate<String> phoneValidator) {
if (!phoneValidator.test(phone)) {
throw new UserBuilderException("Invalid phone provided");
}
this.phone = phone;
return this;
}
public void email(String email, Predicate<String> emailValidator) {
if (!emailValidator.test(email)) {
throw new UserBuilderException("Invalid email provided");
}
this.email = email;
return this;
}
//add more builder methods here
public User build() {
return new User(phone, email);
}
}
您可以将其用于:
Predicate<String> phoneValidator = ....
Predicate<String> emailValidator = ....
User user = new UserBuilder()
.phone("123567", phoneValidator)
.email("[email protected]", emailValidator)
.build();
您得到的是:
User
实例灵活地提供自定义验证规则(或省略其中的一些)。>User
个实例创建了无效的内容。仅为属性元组创建一个User
实例,该元组将通过其构建器中提供的[[allPredicate
。