2016-03-05 82 views
0

我正在使用一些由比較字符串的switch語句組成的Java代碼。在學習之前,大約有5個案例需要添加更多。正則表達式if語句與開關語句混合使用

事實上,我需要添加64個更多的案例(4組16個相似的拼寫值),並且由於字符串的性質,希望使用正則表達式不需要太多的語句。例如,第一組可能的值是「Section ## Stuff」,第二組「Section ## Stuff XYZ」等等;其中##是任意數量的1和16

之間爲了闡明而不是添加的情況下,對於每個字符串,我想正則表達式出類型,然後調用適當的功能等

雖然這一切工作正常,我擔心另一個開發人員很難理解發生了什麼,因爲我基本上已經組合了正則表達式if語句和switch語句。我也不能忍受有非常大的開關語句列表。

什麼是更好的選擇(可讀性vs口才等),是否有可能以某種方式使用正則表達式與我的switch語句?此外,我不認爲會有任何顯着的性能影響,但如果有的話,這將是很高興知道。 :)
下面的代碼是一個例子,因爲我無法提供真實的代碼。

我想要做什麼:

if (str.matches("Section ([1-9]|1[0-6]) Stuff") { 
     //do something with the number provided in string 
    } else if (str.matches("Section ([1-9]|1[0-6]) Stuff 2") { 
     //do something else with the number provided in the string 
    } else { 
     switch (str) { 
     case PARAM_VALUE_1: 
      doSomething1(); 
      break; 
     case PARAM_VALUE_2: 
      doSomething2(); 
      break; 
     ... 
     ... 
     default: 
      break; 
     } 
    } 
  • OR -

    switch (str) { 
        case PARAM_VALUE_1: 
         doSomething1(); 
         break; 
        case PARAM_VALUE_2: 
         doSomething2(); 
         break; 
        ... 
        ... 
        case "Section 1 Stuff": 
         //do something for section 1 
         break; 
        case "Section 2 Stuff": 
         //do something for section 2 
         break; 
        ... 
        ... (64 cases later) 
        default: 
         break; 
        } 
    } 
    

注:我不能重新設計串進來的方式;它來自另一個子系統,它就是這樣。

感謝您的幫助!

+0

你是否真的需要爲每個'case'執行根本不同的代碼,或者是否存在需要由不同情況執行的代碼模式? – entpnerd

+0

從根本上不同。就目前而言,我剛剛使用了更詳細的非正則表達式版本,並且它似乎工作正常。我更加好奇什麼更標準。 – Southpaw

回答

1

對於這種情況,您可以考慮使用Java枚舉,利用它們的重載功能。

enum MyEnum { 
    SectionOne("Section ([1-9]|1[0-6]) Stuff") { 
    @Override 
    public void doSomething() { 
     // implementation for section one when regex matches 
    } 
    }, SectionTwo("Section ([1-9]|1[0-6]) Stuff 2") { 
    @Override 
    public void doSomething() { 
     // implementation for section two when regex matches 
    } 
    }, Param1("ParamValue1") { 
    @Override 
    public void doSomething() { 
     // implementation for param 1 
    } 
    }, Param2("ParamValue2") { 
    @Override 
    public void doSomething() { 
     // implementation for param 2 
    } 
    }; 

    private final Pattern regex; 

    private MyEnum(String strRegex) { 
    this.regex = Pattern.compile(strRegex); 
    } 

    public abstract void doSomething(); 

    public static MyEnum valueFor(String value) { 
    for (MyEnum myEnum : MyEnum.values()) { 
     if(myEnum.regex.matcher(value).matches()) { 
     return myEnum; 
     } 
    } 
    return null; 
    } 
} 

您可以看到IDEOne demo

+0

這樣做的好方法和有趣的方式,感謝您的幫助和鏈接! – Southpaw