2013-07-23 148 views
12

我在嘗試處理特殊情況時使用switch語句時出現問題。 例如, 我有3個的情況:A,B,C.Java開關語句

  • 爲A,我想要做statement_1和statement_3。
  • for B,我想做statement_2和statement_3。
  • 爲C,我想如果我使用if-else語句,它看起來像什麼也不做,

如下:

if (not C){ 
    do statement_3 

    if B 
     do statement 2 
    else if A 
     do statement 1 

} 

如果我想使用switch語句做同樣的事情,我有一些麻煩。

switch (variable){ 
case A: do statement_1 
case B: do statement_2 
// how to do statement 3 here? 
} 

我試圖避免重複的代碼。所以我在想如何讓代碼儘可能簡單。

更新1:

  1. ,使我的代碼/問題更清楚,我只想讓我的代碼 簡單/清楚,我可以,這就是爲什麼我要使用switch語句 而不是if-else。另外,我聽說開關語句通常比if-else更快,比 快。 (雖然我不是100%肯定)。

  2. 我想使用開關櫃,因爲情況A,B,C是枚舉類型。他們 是不可變的。對此感到抱歉。

  3. 每個語句都超過10行代碼。這就是爲什麼我不想做如下:

    switch (enum variable) { 
    case A: 
        statement1 
        statement3 
    break; 
    case B: 
        statement2 
        statement3 
    break; 
    

    }

+0

此代碼不起作用,因爲Java 6和更早版本需要基本類型的值。 Java 7可以用Strings來處理。 – reporter

+2

切換不好 - 你不能跳過案例,這是你必須做的,以避免編碼調用statement_3兩次 – Bohemian

+9

「if」有什麼問題?如果開關不是正確的工具,請不要使用它。大多數時候,這不是正確的工具。 –

回答

25

我會建議定義到底是什麼staments應該執行:

switch (variable){ 
    case A: 
     statement_1(); 
     statement_3(); 
     break; 
    case B: 
     statement_2(); 
     statement_3(); 
     break; 
} 

的更新 - 3:

爲這10行創建方法:

public void statement_1() { 
    //your 10 lines of code 
} 

如果您總是執行statement_3,除情況C外,您可以在寫入它們時使用if/else-blocks。

但在我的誠實觀點: 定義了什麼必須在這種情況下,如果你有少量的情況下要做。 更容易閱讀別人

+1

+1。儘管我是DRY的忠實擁護者,但爲了絕對清晰,額外的一行代碼是一個勝利。 – user949300

3

你可以這樣做:

switch (variable){ 
    case A: do statement_1; do statement_3; break; 
    case B: do statement_2; do statement_3; break;  
} 
1

爲什麼不窩交換機成if語句?這種方式沒有重複的代碼。

if(!C){ 
    statement_3; 
    switch(variable){ 
    case A: 
     statement_1; 
     break; 
    case B: 
     statement_2; 
     break; 
} 

或者同時使用if語句和switch?

if(!C){ 
    statement_3; 
} 
switch(variable){ 
case A: 
    statement_1; 
    break; 
case B: 
    statement_2; 
    break; 
+0

但爲什麼使用2個開關並將它們混合起來?你不會獲得表現或任何東西。它可能會讓其他開發人員感到困惑 –

+0

因爲使用switch語句引用的問題。如果只有2或3個案例,那麼if-elseif-else就是要走的路。但是如果有一組語句共享相同的代碼,說幾十次但不是在一種情況下,爲什麼在交換機之前執行代碼時重複該代碼(只要不滿足某些條件) ? –

0

我經常發現介紹enum s增加了清晰度。在這裏我想每個enum是可以通過一些方法來解決的問題:這裏

enum Issue { 
    A { 
    void handleIt() { 
     statement_1(); 
     statement_3(); 
    } 
    }, 
    B { 
    void handleIt() { 
     statement_2(); 
     statement_3(); 
    } 
    }, 
    C { 
    void handleIt() { 
     // Do nothing. 
    } 
    }, 
    D { 
    void handleIt() { 
     A.handleIt(); 
     B.handleIt(); 
    } 
    }; 

    abstract void handleIt(); 
} 

請注意,您獲得的能夠處理利用等問題的解決某些問題的額外好處(見我Denum)。

0

如果案件有超過2-3的語句是貝蒂(但從可讀性和乾淨的代碼點)將它們提取物作爲單獨的方法:

switch (variable){ 
    case A: handleCaseA(); break; 
    case B: handleCaseB(); break; 
    default: handleDefaultCase(); break; 
} 
0
switch (variable) { 
case A: 
do statement_1; 
do statement_3; 
break; 
case B: 
do statement_2; 
do statement_3; 
break; 
} 
+0

特定產品/資源的過度推廣可能會被社區視爲垃圾郵件。看看[幫助中心](http://stackoverflow.com/help),特別是[用戶期望什麼樣的行爲?](http://stackoverflow.com/help/behavior)的最後一節:避免公開的自我推銷。您可能還對[如何在堆棧溢出做廣告?](http://stackoverflow.com/help/advertising)感興趣。 – Draken

0

下破可以節省大量的執行時間,因爲它「忽略」,在開關的代碼的所有其餘部分的執行塊

public class SwitchExample { 
public static void main(String[] args) { 
    int number=10; 
    switch(number){ 
    case 10: System.out.println("10");break; 
    case 20: System.out.println("20");break; 
    case 30: System.out.println("30");break; 
    default:System.out.println("Not in 10, 20 or 30"); 
    } 
} 
} 

輸出是10

0

這裏你必須用這種方式使用if statement,因爲switch通常也有default值。

if (letter == 'A' || letter == 'B') { System.out.println("Statement 3 ");} 
switch (letter) { 
      case 'A': 
       System.out.println("Statement 1 "); 
       break; 

      case 'B': 
       System.out.println("Statement 2 "); 
       break; 

      case 'C': 
       System.out.println(); 
       break; 
      default: 
       System.out.println("You entered wrong value"); 
     }