我对“组合器”模式得到的结果有个小问题。
public interface CustomerRegistrationValidator
extends Function<Customer, ValidationResult> {
static CustomerRegistrationValidator isEmailValid() {
return customer -> customer.getEmail().contains("@") ?
ValidationResult.SUCCESS : ValidationResult.EMAIL_NOT_VALID;
}
static CustomerRegistrationValidator isPhoneNumberValid() {
return customer -> customer.getPhoneNumber().startsWith("+0") ?
ValidationResult.SUCCESS : ValidationResult.PHONE_NUMBER_NOT_VALID;
}
static CustomerRegistrationValidator isAnAdult() {
return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ?
ValidationResult.SUCCESS : ValidationResult.IS_NOT_AN_ADULT;
}
default CustomerRegistrationValidator and (CustomerRegistrationValidator other) {
return customer -> {
ValidationResult result = this.apply(customer);
return result.equals(ValidationResult.SUCCESS) ? other.apply(customer) : result;
};
}
enum ValidationResult {
SUCCESS,
PHONE_NUMBER_NOT_VALID,
EMAIL_NOT_VALID,
IS_NOT_AN_ADULT
}
}public class Main {
public static void main(String[] args) {
Customer customer = new Customer(
"Alice",
"alicegmail.com",
"089877878",
LocalDate.of(2000, 1, 1)
);
ValidationResult result = CustomerRegistrationValidator.isEmailValid()
.and(CustomerRegistrationValidator.isPhoneNumberValid())
.and(CustomerRegistrationValidator.isAnAdult())
.apply(customer);
System.out.println(result);
if (result != ValidationResult.SUCCESS) {
throw new IllegalStateException(result.name());
}
}
}假设那些方法(isAnAdult,isEmailValid)中有两个错误,那么它是否只打印了枚举类型中的一个错误,在我的例子中,“EMAIL_NOT_VALID”是例外,而不是两个,而第二个错误指的是'IS_NOT_AN_ADULT‘?
发布于 2020-03-24 22:30:17
如果希望验证器能够返回多个不同的结果代码(枚举),则需要将返回类型更改为Set<ValidationResult>,或者更具体地说,更改为EnumSet。
例如,类似这样的事情:
interface CustomerRegistrationValidator
extends Function<Customer, EnumSet<ValidationResult>> {
static final EnumSet<ValidationResult> SUCCESS_ONLY = EnumSet.of(ValidationResult.SUCCESS);
static CustomerRegistrationValidator isEmailValid() {
return customer -> customer.getEmail().contains("@") ?
SUCCESS_ONLY : EnumSet.of(ValidationResult.EMAIL_NOT_VALID);
}
static CustomerRegistrationValidator isPhoneNumberValid() {
return customer -> customer.getPhoneNumber().startsWith("+0") ?
SUCCESS_ONLY : EnumSet.of(ValidationResult.PHONE_NUMBER_NOT_VALID);
}
static CustomerRegistrationValidator isAnAdult() {
return customer -> Period.between(customer.getDob(), LocalDate.now()).getYears() > 16 ?
SUCCESS_ONLY : EnumSet.of(ValidationResult.IS_NOT_AN_ADULT);
}
default CustomerRegistrationValidator and(CustomerRegistrationValidator other) {
return customer -> {
EnumSet<ValidationResult> thisResult = this.apply(customer);
EnumSet<ValidationResult> otherResult = other.apply(customer);
if (thisResult.equals(SUCCESS_ONLY))
return otherResult;
if (otherResult.equals(SUCCESS_ONLY))
return thisResult;
EnumSet<ValidationResult> combinedResult = EnumSet.copyOf(thisResult);
combinedResult.addAll(otherResult);
return combinedResult;
};
}
}https://stackoverflow.com/questions/60839769
复制相似问题