読者です 読者をやめる 読者になる 読者になる

Javaのswitch~case文で扱える条件式

Javaの条件分岐として筆頭のif文の陰に隠れがちですが、switch~case文というのがあります。

switch (条件式) {
  case 値1:
    処理1;
    break; case 値2: 処理2;
break;
default :
処理(else); }

使い方はいろいろなサイトや書籍で紹介されているかと思います。

今回のテーマとするのは「条件式」に有効な型の種類です。

 

switch文 - Java文メモ(Hishidama's Java Statement Memo)

こちらに拠りますと、以下の型が条件式として有効とのことです。

  • byte
  • char
  • short
  • int
  • enum型 (JDK 1.5以降)
  • String型 (JDK 1.7以降)

enum型はちょっと特殊ですが、Stringを除けばプリミティブです。

逆説的にStringではnullがあり得ます。条件式がnullだとNullPointerExceptionとなります。

 

 

JDK 1.7以降ではswitch~case文Stringも使えるようになっていますので、以下のようなコードも書けます。

switch (bloodType) {
  case "A":
    System.out.println("A型です。");
break; case "B": System.out.println("B型です。");
break; case "O": System.out.println("O型です。");
break; case "AB": System.out.println("AB型です。");
break;
default :
System.out.println("えっ…"); }

場合によっては、if~else ifString.equals(String)の比較をつらつら書くよりはすっきりしたコードになると思います。

breakを打つタイミングを意識するとより使いやすくなるでしょう。

 

…と思っていました。

Eclipseswitch~case文を書いていると、以下のエラーに遭遇しました。

case 式は定数式でなければなりません

どうやら、コンパイル時に値が確定していないと使えないようです。

switchで使える定数 - Java定数メモ(Hishidama's Java Constant Memo)

 

今回はpropetiesファイルに定義した語句に一致したら云々、という処理を書くのが目的でした。

ResourceBundle bundle = null;
String value = null;
  try {
    bundle = ResourceBundle.getBundle("hogeprop");
    value = bundle.getString("fuga");
  } catch (MissingResourceException e) {
    e.printStackTrace();
    return;
}
switch (piyo) {
  case value: // Eclipseの場合、ここでコンパイルエラー
    System.out.println("fuga");
    break;
}

コンパイルの時点でvalueの中身が確定しないため、先のエラーとなったようです。

少し工夫してfinal修飾子を付けたStringを経由したりしても同様でした。

 

いわゆる列挙型のenumとは親和性が高いですが、逆にenum以外では素直にif文を書いたほうが良い気がしてきました。