2011-01-11 18 views
5

我使用Java 6Java的開關情況 - 默認VS明確列舉

假設我有6個值的枚舉,有序的A至F關於價值的4共處理相同。我可以這樣寫。

switch (whichType) { 
    case A: 
    case B: 
    case C: 
    case D: 
     return task(); 
    case E: 
     return someothertask(); 
    case F: 
     return anothersomeothertask(); 
} 

或者像這樣。

switch (whichType) { 
    case E: 
     return someothertask(); 
    case F: 
     return anothersomeothertask(); 
    default: 
     return task(); 
} 

空值永遠不會到達此開關。

從簡潔明瞭的角度來看,第二種方法更好。就明確而言,我認爲第一種方法更好。

每種方法都有其他優點/缺點嗎?另外,這個簡單的問題很可能是重複的,但我嘗試過,並且在任何地方都找不到它。我很抱歉,如果我沒有足夠好的搜索。

+4

爲您的枚舉類添加抽象方法? – Ron 2011-01-11 03:33:42

+2

只是爲了記錄:您可以在頂部,中間或`switch`中的任何其他位置放置一個「默認」部分;它不一定在最底層。 – 2011-01-11 03:38:15

回答

7

這兩個都很好,如果該枚舉是絕對的,積極固定在六個值永遠。否則,請考慮枚舉可能的第七個值。如果E和F是關於這個switch邏輯的唯一兩個可能的異常值,並且任何其他值將落在與A到D相同的存儲區中,請繼續並使用default。否則,每個值的安全性爲case

3

假設某人向枚舉中添加了一個值?

在一些代碼,我已經得到了,有這種構造的:

switch(mediaType) { 
    case typeA: 
    case typeB: 
    case typeC: 
     DoGeneric(); 
     break; 
    case TypeD: 
     DoSpecial(); 
     break; 
} 

及其產生的原因是,如果有人添加了另一種可能性,以枚舉,它不會編譯,直至」我們查看了枚舉的使用位置,並確定了當時需要完成的工作。沒有機會錯過一個並且難以追蹤的錯誤。

2

好吧,關於可讀性,我會爭辯說第二個可能不是更清楚。例如,您的常見情況發生在您的特殊情況之後。

但是,我在這裏看到的真正問題是兩段代碼並非真正等價。在第一種情況下,你有六個明確的情況。第二,你有兩個明確的情況,和一個默認情況。這意味着,如果您的代碼出現某種錯誤,您收到一個您沒有預料到的情況,則默認情況下仍會在第二個情況下執行(並且task()仍將運行)。因此,這與您的第一個代碼有根本的不同。

除此之外(決定哪個switch語句是正確的),我會說堅持一個最好的給你。我個人喜歡第一個(因爲它是明確的,如果需要的話可以爲缺省情況留出空間),但是您必須根據您的偏好或公司/團隊的開發標準來決定。

0

如果您正在編寫一些業務場景,並且您希望代碼在未來幾年中能夠生存和維護(由其他人),請使用選項1.選項2沒有任何問題,但它很短並且很清楚,但是當談到可維護性時,我認爲選項1獲勝 - 尤其是在案例與某些業務邏輯相關的情況下。維護工程師閱讀它會容易得多。

2

我傾向於使用默認來捕獲初始實現後添加的新枚舉。這不會產生編譯時錯誤,我更喜歡它,但它通常不會通過煙霧測試。

switch (whichType) { 
    case A: 
    case B: 
    case C: 
    case D: 
     return task(); 
    case E: 
     return someothertask(); 
    case F: 
     return anothersomeothertask(); 
    default: 
     throw new IllegalArgumentException("Encountered unknown type: " + whichType.name()); 
}