Использование свободных интерфейсов для проверки объектов с использованием java 8 - PullRequest
0 голосов
/ 31 января 2020

В настоящее время я выполняю сторонний проект для проверки объектов, используя java 8.

В настоящее время у меня есть это:

  • Интерфейс, который по сути является переписать java 8 интерфейс предикатов:

enter image description here

Затем я создал реализацию того же интерфейса:

enter image description here

И затем этот класс является результатом моей проверки

enter image description here

Проверка конкретного объекта может быть найдена здесь:

public class ConcreteValidator implements EmployeeValidator {
  @Override
  public void validate(Employee employee) throws EmployeeException {

    ValidatorUtil.notNullString.and(ValidatorUtil.notEmptyString)
        .and(ValidatorUtil.stringBetween(1, 100)).test(employee.getFirstName())
        .getFieldNameIfInvalid(" Please specify valid firstname ").orElse("");

    ValidatorUtil.notNullString.and(ValidatorUtil.notEmptyString)
        .and(ValidatorUtil.stringBetween(1, 100)).test(employee.getLastName())
        .getFieldNameIfInvalid(" Please specify valid lastname ").orElse("");

    ValidatorUtil.notNullString.and(ValidatorUtil.notEmptyString)
        .and(ValidatorUtil.stringBetween(3, 100)).test(employee.getEmail())
        .getFieldNameIfInvalid(" Please specify valid email ").orElse("");

    ValidatorUtil.notNullInteger.and(ValidatorUtil.greaterThanZero)
        .and(ValidatorUtil.integerBetween(18, 60)).test(employee.getAge())
        .getFieldNameIfInvalid(" Please specify valid age ").orElse("");
  }
}

Это прекрасно работает, но я хочу сделать Теперь нужно ограничить использование пользователем проверки notNull в первую очередь, и только после этой проверки будут доступны все методы, такие как notEmpty или moreThanZero.

Я искал свободные интерфейсы, но не знаю, является ли это правильным способ сделать это (хочу сделать что-то вроде этого: https://code-held.com/2019/04/29/robust-builder-pattern/)

Подводя итог, я хочу заставить разработчика проверять, является ли объект нулевым первым и все другие методы go далее что-то вроде цепочки API потока в java -8.Вот мои пользовательские проверки.

enter image description here

1 Ответ

2 голосов
/ 31 января 2020

Вы не можете, не так, как вы используете ваши методы: <K> GenericValidation<K> from(Predicate<K> predicate).

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

Вы должны применить это с помощью компилятора, например:

GenericValidation<K> fromNonNull(Predicate<K> predicate) {
  return from(val -> val != null && predicate.test(val));
}

Или используя типы как показано ниже:

validateThat(employee.getFirstName()) // return a StringValidator1
  .isNotNull() // return a StringValidator2
  .isNotEmpty()
  .hasLengthBetween(1, 100)
  ;

StringValidator1 имеет только isNotNull() и возвращает StringValidator2.

Вот так вы бы принудительно применили проверку isNotNull() с помощью компилятора: вернув другой Тип предоставления большего количества услуг, чем по умолчанию. Поскольку StringValidator1 не имеет isNotEmpty(), то компилятор сгенерирует ошибку компиляции, пытаясь вызвать ее.

Вы можете прочитать AssertJ код, чтобы узнать, как они работают с интерфейсом. Конечно, есть и другой свободный исходный код (и я думаю, что самая важная часть «свободного» - это то, что компилятор и IDE помогают проверять, что вы делаете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...