如何在复合Guava谓词中定义失败的谓词

问题描述 投票:1回答:1

我有要执行的“用户”验证的列表,每个验证都实现谓词(来自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");
    }
}

什么是最好的方法?

java guava predicate java-6
1个回答
0
投票

您可以为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实例,该元组将通过其构建器中提供的[[all
  • Predicate
© www.soinside.com 2019 - 2024. All rights reserved.