2016-06-20 8 views
-3

私はJavaプログラミング言語の初心者です。そこで私はサンプルプログラムを試しました(つまり、 - Enum Comparison with Switch-Case Statement)。あなたは上記のプログラムは、あなたは私が第一ケース(i.e:- Case Google:)でbreakキーワードを逃していることに気付くことができます参照してください場合は、以下のJava - Enumとスイッチケースステートメントの比較

public class TestClass { 
    public enum Company { 
     Google(1), 
     Microsoft(2), 
     JPMorgan(3), 
     WellsFargo(4); 

     private int companyRatings; 

     private Company(int companyValue) { 
      this.companyRatings = companyValue; 
     } 
    } 

    public static void enumComparison(Company type) { 
     switch (type) { 
      case Google: 
       System.out.println("Company Name : " + type + " - Company Position : " + type.companyRatings); 
      case Microsoft: 
       System.out.println("Company Name : " + type + " - Company Position : " + type.companyRatings); 
       break; 
      case WellsFargo: 
       System.out.println("Company Name : " + type + " - Company Position : " + type.companyRatings); 
       break; 
      default: 
       System.out.println("Company Name : " + type + " - Company Position : " + type.companyRatings); 
       break; 
     } 
    } 

    public static void main(String[] args) { 
     enumComparison(Company.Google); 
    } 
} 

だからあなたの参照のためのプログラムです。 C#ではswitchステートメントでbreakキーワードが必須であるため、キーワードが見つからないとコンパイル時エラーが発生します。しかし、私はJavaではそれが当てはまらないことに気づいた(No Compile time error for missing the break keyword)。
Mainメソッドでは、Company.Googleを引数として渡しています。 breakキーワードは、1番目のケース(Case Google:)ではなく、2番目のケース(Case Microsoft:)に移動しているので、型の不一致があっても値を出力します。それは不思議で、なぜこれが起こるのか分かりません。したがって、重複した値が出力されます。よくわかりません。

出力

Company Name : Google - Company Position : 1 
Company Name : Google - Company Position : 1 
+5

これを読む必要があります。https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html –

+1

これは、 'break'や' return "または" throw "となり、実行は次のケースに落ちます。これは、JavaがC++から継承した機能で、同じ方法で動作します。ここでは型の不一致はありません(列挙型定数はすべて同じ型の 'Company'です)。 – Jesper

+0

'toString()'メソッドをオーバーライドできませんでしたか? –

答えて

1

Company enumのtoString()に印刷ロジックを移動し、スイッチのステートメントをタイプ別にグループ化するように変更できます。これは、それぞれcaseを持たないswitch-caseを使用する方法を示しています。breakです。

public class TestClass { 
    public enum Company { 
     Google(1), 
     Microsoft(2), 
     JPMorgan(3), 
     WellsFargo(4); 

     private int companyRatings; 

     private Company(int companyRatings) { 
      this.companyRatings = companyRatings; 
     } 

     @Override 
     public String toString() { 
      return "Company Name : " + name() + " - Company Position : " + companyRatings; 
     } 
    } 

    public static void enumComparison(Company type) { 
     switch (type) { 
      case Google: 
      case Microsoft: 
       System.out.println("[Technology Company]: " + type); 
       break; 
      case JPMorgan: 
      case WellsFargo: 
       System.out.println("[Investment Company]: " + type); 
       break; 
      default: 
       System.out.println("[General... Company]: " + type); 
       break; 
     } 
    } 

    public static void main(String[] args) { 
     enumComparison(Company.Google); 
    } 
} 
0

ブレークは必須ではありませんが、そのようなここのように、そうするのは良いアイデアです多くの場合は、まだあります。

P.S .: companyRatingsをprivateに設定して後でアクセスすると、これがコンパイルされて驚いています。

+0

コンパイル時にエラーが表示されない – Aishu

+1

* companyRatingsをプライベートに設定して後でアクセスすると、これがコンパイルされて驚きます。*これはまだ同じクラスなので、もちろん動作します。その他の情報:http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members – Tom

+0

ありがとう@Tom!何か新しい毎日何かを学ぶ:-) –

0

switch文がjavaでどのように定義されているかを示します。条件を満たしたcase文からbreak文までコードを実行します。あなたが同じブロックに対して複数のcase文を持つことができます参照よう

case Google: 
    case Microsoft: 
    System.out.println("Tech Company Name : " + type + " - Company Position : " + type.companyRatings); 
    break; 
    default: 
    System.out.println("No Tech Company Name : " + type + " - Company Position : " + type.companyRatings); 
       break; 

:break文が必要とされていない理由を理解すること

は、この例を考えてみましょう。

+0

もしそれが当てはまる場合は、break文が必須であるか、そうでなければ上記のような重複出力につながるでしょう – Aishu

+0

@Aishuはあなたにもっと柔軟性を与えるので本当にそうではありません – user902383

+0

ええ、答え...私はこの考え方から考えなかった – Aishu

0

それは全く変わっていません。ケースステートメントからbreakを省略すると、スマートコードを作成できます。ここでは、小さなコードの例です:

これは、列挙型

public enum Month{ 
    January(1), 
    February(2), 
    March(3), 
    April(4), 
    May(5), 
    June(6), 
    July(7), 
    August(8), 
    September(9), 
    October(10), 
    November(11), 
    December(12); 
} 

であり、これは、我々はあなたが見ることでトリックを見ることができ、現在の月

switch (currentMonth) { 
     case January: 
      System.out.println("Months to come " + Month.February); 
     case February: 
      System.out.println("Months to come " + Month.March); 
     case March: 
      System.out.println("Months to come " + Month.April); 
     case April: 
      System.out.println("Months to come " + Month.May); 
     case May: 
      System.out.println("Months to come " + Month.June); 
     case June: 
      System.out.println("Months to come " + Month.July); 
     case July: 
      System.out.println("Months to come " + Month.August); 
     case August: 
      System.out.println("Months to come " + Month.September); 
     case September: 
      System.out.println("Months to come " + Month.October); 
     case October: 
      System.out.println("Months to come " + Month.November); 
     case November: 
      System.out.println("Months to come " + Month.December); 
     case December: 
      System.out.println("This is the last month of the year"); 
      break; 
     default: 
      System.out.println("Invalid year"); 
      break; 
    } 

を渡しているスイッチケースブロックであります出力。