今まで、JavaではStringを判定するときに色々苦労した。
一番ダサいやり方は以下の様にコードを書いている。
public class SwitchToStringJavaSE6 { /** * Stringの分岐は今までこうだった。はず。。。 */ public static void main(String[] args){ String target = "TRUE"; // "TRUE"を判定する if ("FALSE".equals(target)) { System.out.println("FALSE"); } else if ("DEFAULT".equals(target)) { System.out.println("DEFAULT"); } else if ("TRUE".equals(target)) { System.out.println(target); } else { System.out.println("NOTARGET"); } } }
これで”TRUE”を判定し、”TRUE”と表示していた。
しかし、JavaSE7ではなんとSwitchでStringも使えるようになった。。。
ウソだろ。。。
public class SwitchToStringJavaSE7 { /** * JavaSE7のステキなSwitch文 */ public static void main(String[] args) { String target = "TRUE"; // Switch文でStringを判定する。 switch(target) { case "FALSE": System.out.println("FALSE"); break; case "DEFAULT": System.out.println("DEFAULT"); break; case "TRUE": System.out.println(target); break; default: System.out.println("NOTARGET"); break; } } }
これで”TRUE”が表示される。
これって・・・。
新人がよく間違えるSwitch文じゃないかしら・・・。
StringはSwitch使えないんだよ!って教えられた気がする。
どういう原理????
JavaSE6で書くと、こういうことらしい。
public class SwitchToStringJavaSE6Reproduce { /** * JavaSE6でJavaSE7のSwitchを再現する。 */ public static void main(String[] args) { String target = "TRUE"; // ハッシュコード判定用 int hash = -1; switch (target.hashCode()) { // ハッシュコードの確認を行う。 case 66658563: // "FALSE"のハッシュコード if ("FALSE".equals(target)) { // ハッシュコードが同じ文字列を考慮 hash = 0; } break; case -2032180703: // "DEFAULT"のハッシュコード if ("DEFAULT".equals(target)) { // ハッシュコードが同じ文字列を考慮 hash = 1; } break; case 2583950: // "TRUE"のハッシュコード if ("TRUE".equals(target)) { // ハッシュコードが同じ文字列を考慮 hash = 2; } break; } // 判定後の処理をさらに記載する。 switch (hash) { case 0: System.out.println("FALSE"); break; case 1: System.out.println("DEFAULT"); break; case 2: System.out.println("TRUE"); break; default: System.out.println("NOTARGET"); } } }
なるほど。こういう手があったか。。。
でも、これは自動コンパイルの中で実施してもらわないと、やっぱり使えないな。。。
というわけで、JavaSE7は上記のようなめんどくさいことをやってくれるおかげでSwitch文でStringが使えるわけだ。
ありがとう。JavaSE7。
ちなみに、問題もある。
switch(null) { // コンパイルエラー case null; // コンパイルエラー // 省略 }
じゃあ、これはどうだ。
String target = null; switch(target) { // NullPointerExceptionが発生 case "TEST": // 省略 }
null.hashCode()を実施してNullPointerExceptionが発生する。
ということは、StringのSwitch文の前には必ずnullチェックを付けたほうが良いみたい。
使い方はそれぞれだが、凄く活用できそうな拡張であることがわかった。