使用流畅的界面通过Java 8

我目前正在做一个辅助项目,以使用Java 8验证对象。

目前我有这个:

  • 本质上是对Java 8谓词接口的重写的接口:

使用流畅的界面通过Java 8

然后,我创建了相同接口的实现:

使用流畅的界面通过Java 8

然后这个类是我验证的结果

使用流畅的界面通过Java 8

具体的对象验证可以在这里找到:

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或GreaterThanZero之类的所有方法才可用。

我搜索了流畅的界面,但不知道这是否是正确的方法(想做这样的事情:https://code-held.com/2019/04/29/robust-builder-pattern/

总而言之,我想强迫开发人员先验证对象是否为null,然后再验证所有其他方法,例如java-8中Stream API的链接。这是我的customValidations。

使用流畅的界面通过Java 8

louyiqing405 回答:使用流畅的界面通过Java 8

您不能,而不是如何使用方法:<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 帮助帮助您验证正在做的事情)。

本文链接:https://www.f2er.com/2680770.html

大家都在问