2013-07-23 1 views
12

Ich habe ein Problem mit Switch-Anweisung, wenn ich versuchte, mit einer besonderen Situation umzugehen. Zum Beispiel Ich habe 3 Fälle: A, B, C.Java Switch-Anweisung

  • für A, I statement_1 und statement_3 tun will.
  • für B, ich möchte statement_2 und statement_3 tun.
  • für C, ich will nichts

tun, wenn ich if-else-Anweisung verwenden, sieht es wie folgt aus:

if (not C){ 
    do statement_3 

    if B 
     do statement 2 
    else if A 
     do statement 1 

} 

Wenn ich will switch-Anweisung verwenden, um das gleiche zu tun Ding, ich habe einige Schwierigkeiten.

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

Ich versuche, die duplizierten Codes zu vermeiden. Also denke ich, wie ich die Codes so einfach wie möglich machen kann.

UPDATE 1:

  1. meiner Codes/Frage klarer zu machen, ich will nur meine Codes machen so einfach/klar, wie ich kann, weshalb ich switch-Anweisung verwenden möchten anstelle von if-else. Außerdem habe ich gehört, dass switch-statement in der Regel schneller als wenn-sonst ist. (Ich bin jedoch nicht 100% sicher).

  2. Ich möchte Switch-Fall verwenden, weil Fall A, B, C Enum-Typ sind. Sie sind sind nicht variabel. Entschuldigung für die Verwirrung.

  3. jede Aussage sind mehr als 10 Zeilen von Codes. Deshalb will ich nicht das Folgende tun:

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

    }

+0

Dieser Code wird nicht funktionieren, da Java 6 und älter einen Wert eines primitiven Typs erwartet. Java 7 kann das mit Strings behandeln. – reporter

+2

Switch ist nicht gut - Sie können Fälle nicht überspringen, was Sie tun müssten, um zu vermeiden, den Aufruf von statement_3 zweimal zu codieren – Bohemian

+9

Was ist falsch mit 'if'? Wenn ein Schalter nicht das richtige Werkzeug ist, verwenden Sie ihn nicht. Meistens ist es nicht das richtige Werkzeug. –

Antwort

25

ich empfehlen würde, genau zu definieren, was staments ausgeführt werden soll:

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

für Update- 3:

Methoden für diese 10 Zeilen erstellen:

Wenn Sie immer statement_3 ausführen, außer Fall C können Sie mit if/else-blocks arbeiten, wie Sie sie geschrieben haben.

aber in meiner ehrlichen Meinung: definieren GENAU, was in diesem Fall zu tun ist, wenn Sie eine kleine Anzahl von Fällen haben. es ist einfacher, für andere zu lesen

+1

+1. Während ich ein großer Befürworter von DRY bin, ist eine zusätzliche Codezeile für absolute Klarheit ein Gewinn. – user949300

3

Sie können dies tun:

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

Warum nicht Nest der Schalter in die if-Anweisung? Es gibt keinen Wiederholungscode auf diese Weise.

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

oder nutzen Sie die if-Anweisung und den Schalter?

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

aber warum einen Schalter mit 2 Fällen verwenden und alles vermischen? Du gewinnst keine Leistung oder irgendetwas. es könnte für andere Entwickler verwirrend sein –

+0

Da die Frage mit einer switch-Anweisung bezeichnet. Wenn es nur 2 oder 3 Fälle sind, dann ist das if-elseif-else der richtige Weg. Aber wenn es eine Gruppierung von Anweisungen gibt, die alle den gleichen Code haben, sagen Sie ein paar Dutzend Male, aber nicht unter einem Szenario, warum wiederholen Sie den Code, wenn Sie ihn vor dem Switch ausführen lassen können (solange eine bestimmte Bedingung nicht erfüllt ist) ? –

0

Ich finde oft Einführung enum s gibt Klarheit. Hier stelle ich mir jede enum ist ein Problem, das durch eine Reihe von Verfahren gelöst werden können:

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

Hinweis hier, dass Sie den zusätzlichen Vorteil, in der Lage zu bekommen, um bestimmte Themen zu behandeln mit den Lösungen anderer Probleme (meine D sehen enum).

0

Wenn ein Fall mehr als 2-3 Aussagen hat es bettet (aus Sicht der Lesbarkeit und sauberen Code) als separate Methoden zu extrahieren:

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

Übermäßige Werbung für ein bestimmtes Produkt/eine Ressource kann von der Community als Spam wahrgenommen werden. Werfen Sie einen Blick auf die [Hilfe-Center] (http://stackoverflow.com/help), speziell [Welche Art von Verhalten wird von Benutzern erwartet?] (Http://stackoverflow.com/help/behavior) den letzten Abschnitt : Vermeiden Sie offene Eigenwerbung. Vielleicht interessiert Sie auch [Wie kann ich auf Stack Overflow werben?] (Http://stackoverflow.com/help/advertising) – Draken

0

Ein Bruch kann eine sparen viele Ausführungszeit, weil es „ignoriert“ die Ausführung aller Rest des Codes in der Schalterblock

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

Ausgang ist 10

0

Hier müssen Sie if statement auf diese Weise verwenden, denn in switch gibt es normalerweise auch default Wert.

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