2013-04-10 7 views
14

ネストされたswitchステートメントの使用を組み込んだメソッドを今日書いたので、コードはかなりきれいでわかりやすく見えましたが、ネストされたswitchステートメントは通常、あなたが追加したより多くのswitch文で混乱を招くことがあります。ここに私のコードは次のように見えたもののサンプルです:Javaのネストされたスイッチステートメントの代わり

EnumOne enumOne; 
EnumTwo enumTwo = null; 
EnumTwo enumThree = null; 

switch (enumOne) { 
    case CASE_ONE: 

     switch (enumTwo){ 
     case A: enumTwo = EnumTwo.B; break; 
     case C: enumTwo = EnumTwo.D; break; 
     default: break; 
     } 

     switch (enumThree) { 
     case AA: enumThree = EnumTwo.BB; break; 
     case CC: enumThree = EnumTwo.DD; break; 
     default: break; 
     } 

     break; 

    case CASE_TWO: 
    case CASE_THREE: 

     switch(EnumTwo) { 
     default: break; 
     } 

     switch (enumThree) { 
     case AA: enumThree = EnumTwo.XX; break; 
     case CC: enumThree = EnumTwo.YY; break; 
     default: break; 
     } 

     break; 

    default: 
     break; 
} 

だから私の質問は、これらのswitch文に適切な代替どのようになるか、基本的に、でしょうか?

+1

何を使用していますか?ステートマシンをモデル化するには? – flup

+2

したがってenumTwoはenumの1,2、および3の値に応じて値を設定しますか?なぜ新しい値を返すenumTwoのメソッドを持っていないのですか?状態パターンと同様です。 –

+0

多くのネストされたswitch/ifステートメントの使用は、通常、設計上の欠陥を示します。特に、OO言語でこれを行う場合は、利用可能な機能を使用する必要があります。 – gersonZaragocin

答えて

14

入れ子になったswitch文をプロシージャの呼び出しで置き換え、入れ子になったswitchコードを実行することをお勧めします。スイッチの多くを使用するなど、

EnumOne enumOne; 
    EnumTwo enumTwo = null; 
    EnumTwo enumThree = null; 

    switch (enumOne) 
    { 
     case CASE_ONE: 

      nested_switch1(); 

     case CASE_TWO: 
     case CASE_THREE: 

      nested_switch2(); 

      break; 

     default: 
      break; 
    } 

    nested_switch1() { 
      switch (enumTwo) 
      { 
      case A: 
       enumTwo = EnumTwo.B; 
       break; 
      case C: 
       enumTwo = EnumTwo.D; 
       break; 
      default: 
       break; 
      } 

      switch (enumThree) 
      { 
      case AA: 
       enumTwo = EnumTwo.BB; 
       break; 
      case CC: 
       enumTwo = EnumTwo.DD; 
       break; 
      default: 
       break; 
      } 

      break; 
    } 

nested_switch2() { 
      switch(EnumTwo) 
      { 
      default: 
       break; 
      } 

      switch (enumThree) 
      { 
      case AA: 
       enumTwo = EnumTwo.XX; 
       break; 
      case CC: 
       enumTwo = EnumTwo.YY; 
       break; 
      default: 
       break; 
      } 
} 
+0

基本的なOOPの原則。 – klutch

20
  1. が読みかなり難しいようになります。代わりにこのような

    書き込み何か。

  2. そして新しいケースは、我々はコードを変更し、私たちは、このような場合にpolymorphism

    の使用を検討することができCASE

を追加する必要があり、その後発生し、私はあなたをできるように単純なクラスを与えるつもりだ任意の時間わかる。 今、我々は、スイッチケース

class Test 
{ 
    Animal a; 
    public Test(Animal a) 
    { 
     this.a=a; 
    } 
    public moveThisAnimal() 
    { 
     System.out.println(this.a.move()); // all switch case statements removed 
    } 
} 

とさえ私たちがなければ、テストクラスを持っている今、私たちは私たちの多型ロジックと

Interface Animal 
{ 
    String move(); 
} 

Class Dog implements Animal 
{ 
    public String move() 
    { 
     return "walk"; 
    } 
} 


Class Bird implements Animal 
{ 
    public String move() 
    { 
     return "fly"; 
    } 
} 


Class Fish implements Animal 
{ 
    public String move() 
    { 
     return "swim"; 
    } 
} 

をこれらのスイッチを交換するスイッチケース

class Test 
{ 
    Animal a; 
    public Test(Animal a) 
    { 
     this.a=a; 
    } 

    public moveThisAnimal() 
    { 
     switch(this.a) 
     { 
      case fish: 
      System.out.println("swim"); 
      break; 

      case dog: 
      System.out.println("walk"); 
      break; 

      case bird: 
      System.out.println("fly"); 
      break; 
     } 
    } 
} 

でクラス以前の仮定さらなる変更を加える必要があります。ここに変更を加えることなく、実装を追加するだけです。

完全なコードを参照して実行可能かどうかを確認

+0

これは、提示されているものにいくつかの問題があることを除いて、非常に便利な答えでした。 "クラス"は小文字で、各動物の移動を上書きする必要があります。 また、最初の例では、それらをSystem.out.printlnとして表示していますが、この方法では「正しい」方法では表示されません。 私はそれがこのよう ます。public void moveThisAnimal(){ のSystem.out.println(this.aをしました。move()); //すべてのswitch caseステートメントが削除されました public static void main(String [] args) { Dog d = new Dog(); テストt =新しいテスト(d)。 t.moveThisAnimal(); } – XaolingBao

4

整数XとYがあり、両方をオンにする必要がある場合は、それらをあいまいな方法で組み合わせて組み合わせをオンにすることができます。たとえば、y <の場合10:

switch (x*10+y) 
{ 
case 0: // x == y == 0 
case 1: // x ==0, y == 1 
/// 
case 10: // x == 1, y == 0 
case 11: // x == y == 1 
// 
} 
+0

これは、これを行うための最も簡単で最善の方法です。 – Napolean

+1

これは、順序が重要ではないことを前提としています。 x * 10 + y = y * 10 + xである。偽陽性につながる可能性があります –

+1

@inkalimeva *例*はその前提にしています。一般的な手法ではありません。 – EJP

関連する問題