簡體   English   中英

Java避免使用過多的if語句或過多的驗證器類

[英]Java avoid using too many if statement or too many validator classes

我正在使用許多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語句塊。

您可以使用Composite模式來維護所有驗證器的列表:

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個類”,而是可以使用lambda即時創建一個列表。

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值進行了Result.OK

如今,由於計算機的強大功能,您可能不應該關心的是性能。 現在,大多數程序員都嘗試編寫可讀且干凈的代碼。

因此,我相信如果編寫20 ifs會使您的代碼更易於理解和更靈活,則實現起來也不錯。

順便說一句,您也可以使用switch case

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

如果您的案例不相似並且具有不同的方面,則使用Validator模式將導致不靈活(可能會導致這一點,具體取決於情況)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM