web-dev-qa-db-ja.com

Java Switchステートメント

特別な状況に対処しようとすると、switchステートメントの使用に問題があります。たとえば、A、B、Cの3つのケースがあります。

  • aについては、statement_1とstatement_3を実行します。
  • 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. 私のコード/質問をより明確にするために、私は自分のコードをできるだけ単純/明確にしたいので、if-elseの代わりにswitchステートメントを使用したいのはそのためです。また、switch-statementは通常if-elseよりも速いと聞きました。 (私は100%確かではありません)。

  2. ケースA、B、Cはenum型なのでswitch-caseを使いたい。それらは可変ではありません。混乱については申し訳ありません。

  3. 各ステートメントは、10行を超えるコードです。そのため、次のことは行いたくありません。

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

    }

14
Joey

どの文を実行するかを正確に定義することをお勧めします。

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

pdate-3の場合:

これらの10行のメソッドを作成します。

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

常にstatement_3を実行している場合、Cの場合を除いて、記述したif/else-blocksを使用できます。

しかし、私の正直な意見では、あなたが少数のケースを持っている場合、そのケースで何をしなければならないかを正確に定義してください。他の人にとって読みやすい

26
Philipp Sander

あなたはこれを行うことができます:

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

スイッチをifステートメントにネストしませんか?このように、繰り返しコードはありません。

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

または、ifステートメントとスイッチの両方を使用しますか?

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

ここでは、このように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");
        }       
0
R.Nish

ケースに2つ以上のステートメントがある場合は、それらを個別のメソッドとして抽出することをお勧めします(読みやすさとクリーンなコードの観点から)。

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

ブレークにより、スイッチブロック内の残りのコードすべての実行が「無視」されるため、実行時間を大幅に節約できます

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

出力は1

0
Keshav Gera

enumsを導入するとわかりやすくなることがよくあります。ここで、それぞれの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();
}

ここで、他の問題の解決策を使用して特定の問題を処理できるという追加の利点があることに注意してください(my Denumを参照)。

0
OldCurmudgeon