Как определить ошибочный предикат в составном предикате Guava - PullRequest
1 голос
/ 02 апреля 2020

У меня есть список проверок «User», которые должны быть выполнены, каждая проверка реализует Predicate (из Гуавы). У меня есть следующий метод, который заполняет Список проверок, которые должны быть выполнены, и создает составленный Предикат всех проверок.

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);
}

Вопрос: когда я вызову применить apply к compuUserValidations, и одна из них потерпит неудачу, есть ли способ чтобы найти, какой именно не удается. Теперь у меня есть:

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");
    }
}

Каков будет лучший способ сделать это?

1 Ответ

2 голосов
/ 17 апреля 2020

Вы можете создать конструктор для своего User класса, назовем его UserBuilder.

Для каждого из свойств User (логин, электронная почта, телефон) в классе построителя, Вы можете указать не только значение, которое вы хотите установить для экземпляра User, но и Predicate, который вы можете сразу применить. Если какой-либо из предикатов потерпит неудачу, вы можете легко сгенерировать исключение и / или вывести сообщение, например, c.

Для всех создаваемых вами экземпляров вы можете при желании передать различные правила проверки или дополнительно Разработайте ваш конструктор так, чтобы пропустить проверку для любого из полей 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("something@example.com", emailValidator)
            .build();

Что вы получить следующее:

  • Гибкость для предоставления пользовательских правил проверки (или пропуска некоторых из них) для каждого имеющегося у вас экземпляра User.
  • Лучшая видимость того, какие свойства не соответствуют их соответствующим параметрам. правила проверки.
  • Нет User экземпляров, созданных с недопустимым содержимым. Экземпляр User будет создан только для кортежей свойств, которые передают все значения Predicate, предоставленные в их построителях.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...