2013-07-23 10 views
12

Mam problem z użyciem instrukcji switch, gdy próbowałem zająć się szczególną sytuacją. Na przykład mam 3 przypadki: A, B, C.Java Switch Statement

  • dla A, chcę zrobić statement_1 i statement_3.
  • dla B, chcę zrobić oświadczenie_2 i oświadczenie_3.
  • dla C, chcę zrobić nic

jeśli mogę użyć if-else, będzie to wyglądać następująco:

if (not C){ 
    do statement_3 

    if B 
     do statement 2 
    else if A 
     do statement 1 

} 

Jeśli chcę użyć instrukcji switch do tego samego rzecz, mam pewne kłopoty.

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

Próbuję uniknąć powielonych kodów. Więc myślę, że jak zrobić kody tak proste, jak tylko mogę.

UPDATE 1:

  1. aby mój kody/pytanie bardziej jasne, po prostu chcę, aby moje kody tak proste/jasne, jak mogę, dlatego chcę użyć instrukcji switch zamiast if-else. Słyszałem również, że instrukcja switch jest zwykle szybsza niż w przypadku-else. (Nie jestem jednak w 100% pewny).

  2. Chcę użyć przełącznika, ponieważ przypadki A, B, C są typu enum. one nie są zmienne. Przepraszam za zamieszanie.

  3. każde wyrażenie zawiera więcej niż 10 wierszy kodów. Dlatego nie chcę, aby wykonać następujące czynności:

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

    }

+0

Ten kod nie będzie działać, ponieważ Java 6 i starsze urządzenia oczekują wartości typu pierwotnego. Java 7 może to zrobić za pomocą Ciągów. – reporter

+2

przełącznik nie jest dobry - nie można pominąć przypadków, co należy zrobić, aby uniknąć kodowania połączenia z instrukcją_3 dwukrotnie – Bohemian

+9

co jest nie tak z "jeśli"? Jeśli przełącznik nie jest odpowiednim narzędziem, nie używaj go. Przez większość czasu nie jest to właściwe narzędzie. –

Odpowiedz

25

polecam aby dokładnie określić, co staments powinny być wykonywane:

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

dla update 3:

utwórz metody dla tych 10 linii:

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

jeśli zawsze wykonujesz instrukcję statement_3, z wyjątkiem przypadku C, z którym możesz przejść, jeśli/else-blocks, gdy je pisałeś.

ale w mojej szczerej opinii: zdefiniuj DOKŁADNIE, co należy zrobić, w takim przypadku, jeśli masz małą liczbę przypadków. jest łatwiejsze do odczytania dla innych

+1

+1. Podczas gdy ja jestem wielkim zwolennikiem DRY, jedna dodatkowa linia kodu dla absolutnej jasności jest wygrana. – user949300

3

Można to zrobić:

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

Dlaczego nie gniazdo przełącznika do if? w ten sposób nie ma powtórzeń kodu.

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

lub użyć zarówno instrukcji if, jak i przełącznika?

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

, ale po co używać przełącznika z 2 skrzyniami i mieszać wszystko? nie zyskujesz wydajności ani nic. może to być mylące dla innych programistów. –

+0

Ponieważ pytanie odnosi się do użycia instrukcji switch. Jeśli jest to tylko 2 lub 3 przypadki, wtedy if-elseif-else jest drogą do zrobienia. ale jeśli istnieje grupa zdań, które wszystkie mają ten sam kod, powiedzmy kilkadziesiąt razy, ale nie pod jednym scenariuszem, po co powtarzać kod, kiedy można go wykonać przed przełączeniem (o ile pewien warunek nie jest spełniony) ? –

0

Często wprowadzam do wiadomości wprowadzanie enum. Tu mogę sobie wyobrazić każdy enum jest kwestią, która może zostać rozwiązany poprzez szereg procesów:

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(); 
} 

tu zauważyć, że można uzyskać dodatkowe korzyści z bycia w stanie obsługiwać pewne problemy przy użyciu rozwiązania innych problemów (patrz moja Denum).

0

Jeśli sprawa ma więcej niż 2-3 wypowiedzi to Bette (z punktu widzenia czytelności i czystego kodu), aby wyodrębnić je jako oddzielne metod:

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

Nadmierna promocja określonego produktu/zasobu może być postrzegana przez społeczność jako spam. Spójrz na [centrum pomocy] (http://stackoverflow.com/help), szczególnie [Jakiego rodzaju zachowanie oczekuje się od użytkowników?] (Http://stackoverflow.com/help/behavior) w ostatniej sekcji : Unikaj jawnej autopromocji. Być może zainteresuje Cię również [Jak reklamować się w Stack Overflow?] (Http://stackoverflow.com/help/advertising) – Draken

0

Przerwa może zaoszczędzić wiele czasu realizacji, ponieważ „ignoruje” wykonanie całej reszty kodu w przełącznik blokowania

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"); 
    } 
} 
} 

wyjściowa jest 10

0

Tutaj musisz użyć if statement w ten sposób, ponieważ w switch jest również zwykle wartość 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"); 
     }