Javaの条件分岐として筆頭のif文の陰に隠れがちですが、switch~case文というのがあります。
switch (条件式) { case 値1: 処理1;
break; case 値2: 処理2;
break;
default :
処理(else); }
使い方はいろいろなサイトや書籍で紹介されているかと思います。
今回のテーマとするのは「条件式」に有効な型の種類です。
switch文 - Java文メモ(Hishidama's Java Statement Memo)
こちらに拠りますと、以下の型が条件式として有効とのことです。
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 ifでString.equals(String)の比較をつらつら書くよりはすっきりしたコードになると思います。
breakを打つタイミングを意識するとより使いやすくなるでしょう。
…と思っていました。
Eclipseでswitch~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を経由したりしても同様でした。