首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合器模式

组合器模式
EN

Stack Overflow用户
提问于 2020-03-24 21:40:06
回答 1查看 1.7K关注 0票数 0

我对“组合器”模式得到的结果有个小问题。

代码语言:javascript
复制
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
    }

}

代码语言:javascript
复制
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‘?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 22:30:17

如果希望验证器能够返回多个不同的结果代码(枚举),则需要将返回类型更改为Set<ValidationResult>,或者更具体地说,更改为EnumSet

例如,类似这样的事情:

代码语言:javascript
复制
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;
        };
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60839769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档