Java 避免使用过多的 if 语句或过多的验证器类

  • 本文关键字:验证 语句 if Java java
  • 更新时间 :
  • 英文 :


>我正在使用很多if语句来检查。喜欢:

if(statement 1){ 
   block 1;
}
if(statement 2){
   block 2;
}
...//about at least 20 if
if(statement n){
   block n;
}

为了避免使用太多的if语句,我尝试使用策略模式,该模式将为每个if语句创建验证器类。喜欢:

public interface Validator<SomeObejct>{
    public Result validate(SomeObject o);
 } 
public class SomeValidator implements Validator<SomeObject> {
   @Override
    public boolean validate(SomeObject o) throw Exception{
        if(statement 1){ 
            block 1;
         }  
}

因为我可能至少有 20 个 if 语句,所以它可能需要至少 20 个验证器类。那么,如果有更好的解决方案呢?或者我如何管理这 20 个验证器类?

编辑:

更具体地说,我正在编写一些代码来按我的时间表检查问题。例如:

 if(currentDate > mustFinishDate){
     warning();
 }
 if(NotScheduleADateForThisTask){
    warning();
 }
 if(DateFormatNotCorrect){
    error();
 }

日期检查上方也可能是 if 语句块。

您可以使用复合模式来维护所有验证程序的列表:

class ValidatorComposite<T> implements Validator<T> {
    List<Validator<T>> validators = new ArrayList<>();
    public void addValidator(Validator<T> add) { validators.add(add)); }
    public Result validate(T toValidate) {
        Result result = Result.OK;
        for (Validator<T> v : validators) {
            result = v.validate(toValidate);
            if (result != Result.OK) break;
        }
        return result;
    }
}

由于Validator只有一个方法,对于Java 8来说,它是一个函数式接口,所以你不需要"20个类",而是可以使用lambdas即时创建一个列表。

ValidatorComposite<SomeObject> val = new ValidatorComposite<>();
val.addValidator(so -> condition1 ? block1(so) : Result.OK);
val.addValidator(so -> condition2 ? block2(so) : Result.OK);

等等。

您的代码示例并不是真正一致的,因为首先您声明Validator返回Result,然后让实现返回boolean(甚至抛出Exception),所以我通过忽略异常和使用Result.OK值来集成两者。

如今,由于计算机的强大功能,您可能不应该关心性能。 现在大多数程序员都试图编写可读和干净的代码。

所以我相信,如果编写 20 ifs使您的代码更易于理解和更灵活,那么实现它也不错。

顺便说一句,您也可以使用switch case

switch (variable){
     case 1:{
     //block 1
      }
      case 2:{
      //block2
      }
      ...
}

如果您的情况不相似并且具有不同的方面,使用该Validator模式将导致不灵活(这可能会导致这一点,这取决于情况)。

最新更新