Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举作为验证程序_Java_Validation_Enums - Fatal编程技术网

Java 枚举作为验证程序

Java 枚举作为验证程序,java,validation,enums,Java,Validation,Enums,下面是其中一个方法中的代码。此外,在许多方法中都有类似的验证 if (!isAgreeTermsAndConditions()) { addException(Messages.AGREE_TERMS_AND_CONDITIONS); } else { if (!validationManager.isValidSsn(getSsn())) { addException(Messages.INVALID_SSN); } if (!

下面是其中一个方法中的代码。此外,在许多方法中都有类似的验证

if (!isAgreeTermsAndConditions()) {
     addException(Messages.AGREE_TERMS_AND_CONDITIONS);
} else {
      if (!validationManager.isValidSsn(getSsn())) {
          addException(Messages.INVALID_SSN);
      }
      if (!validationManager.isValidDate(getBirthYear()) {  
            addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);                                                                                      
       }
   }  
}  
作为重构的一部分,我提出了以下方法。基本上,将验证逻辑移动到枚举

 class MyFormHandler{
                  public void submitOrder(){
                        MyFormHandlerWorker.SUBMIT_ORDER.validate(this);
                 }

                  public void addItemToCart(){
                      MyFormHandlerWorker.ADD_TO_CART.validate(this);
                  }

                  public void removeItemFromCart(){
                        MyFormHandlerWorker.REMOVE_FROM_CART.validate(this);
                   }
        }

        enum MyFormHandlerWorker{
          SUBMIT_ORDER{
               validate(MyFormHandler fh){
                      //perform validations 
                      if (!fh.isAgreeTermsAndConditions()) {
                          fh.addException(Messages.AGREE_TERMS_AND_CONDITIONS);
                      } else {
                           if (!fh.getValidationManager().isValidSsn(fh.getSsn())) {
                               fh.addException(Messages.INVALID_SSN);
                            }
                            if (!fh.getValidationManager().isValidDate(fh.getBirthYear()) {  
                              fh.addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);                                                                                      
                            }
                        }  
                   } 
               }
           };

         public abstract void validate(MyFormHandler fh);
        }
移动验证后,
MyFormHandler
看起来更干净,但是我不习惯枚举与表单处理程序的反向依赖关系。可以看出,枚举上有太多的
fh.method()
调用,这表明在表单处理程序中使用代码会更好


有没有更好的方法来调整枚举或重构它?

是否有许多操作,每个操作都使用许多验证,但组合方式不同,并且都遵循类似的if-logic模式?是的,有许多操作,每个操作都有自己的if-else-if-else验证模式,为什么要拆分代码?当然,表单知道如何验证自身。另一方面,在设计使用哪种验证器之前,您必须知道它是什么样的形式,这与拥有枚举的大部分目的背道而驰。为什么不将s validate()方法添加到表单中呢?表单处理程序有大约3000行代码,其中验证分散在整个表单中。表单中有许多validate()方法,代码看起来很混乱。我希望将Validation移动到单独的组件,但是由于验证的结果只是表单(.addExceptions)上的操作,因此表单处理程序本身似乎是处理这些验证的最佳位置。也许一个封装这些验证的内部类是个好主意?我的意思是,您应该为FormHandler创建一个抽象基类,并为覆盖validate方法的每个特定表单创建一个子类。如果您必须计算出从请求中的信息中使用的表单处理程序(例如,所有表单使用相同的URL),请考虑“工厂方法”模式。