switch命令
式の値によって処理を分岐する – switch命令- switch(exp) {
- case val1:
- statements
- case val2:
- statements
- …
- default:
- statements
- }
- exp:任意の式
- val1、2…:expと比較する値
switch命令は、与えられた式(変数)の値によって、処理を分岐します。式の値は、char/byte/short/int/String/enum型のいずれかでなければなりません(ただし、String型を使えるのはJavaSE 7以降)。
たとえば以下は、変数valの値(1…3)に応じて対応するメッセージを表示します。それぞれの値に応じて実行する処理はcase句で、すべての値に合致しなかった場合に実行する処理はdefault句で表します。
StatSwitch.java
package com.example.mynavi.control; public class StatSwitch { public static void main(String[] args) { int val = 3; switch (val) { case 1: System.out.println("変数valは1です"); break; case 2: System.out.println("変数valは2です"); break; case 3: System.out.println("変数valは3です"); break; default: System.out.println("変数valは1、2、3いずれでもありません"); break; } // 結果:変数valは3です } }
なお、case、default句の末尾は、break命令で終わるのが原則です。さもないと、次の句が続けて実行されてしまいます。句の区切り目で、自動的にブロックを抜けるわけではない点に注意してください。
フォールスルー
ただし、あえて句の終わりに、break命令を指定しないこともあります。例えば以下のような場合です。
switch (val) { case 1: case 2: ...中略... break; case 3: ...中略... break; }
これによって、変数valが1、または2の場合に実行する命令群を表現できます。このような書き方をフォールスルーと言います。
Java12以降の新構文Java 12以降では、switch命令に新たな構文が追加されました。執筆時点ではPreview機能ですが、今後の正式実装に向けて、理解しておくことをお勧めします。
StatSwitchNew.java
package com.example.mynavi.control; public class StatSwitchNew { public static void main(String[] args) { String lang = "Ruby"; @SuppressWarnings("preview") String category = switch(lang) { case "PHP", "Python", "Ruby" -> "スクリプト言語"; case "Java", "C#", "C" -> "プログラミング言語"; default -> "不明"; }; System.out.println(category); // 結果:スクリプト言語 } }
ポイントとなる構文は、以下です。
(1)switch式
switchが式として表現できます。つまり、文の中でswitch命令を記述できます。なお、switch式では値を返さないパターンがあってはいけないので、default句は省略不可です。
(2)アロー演算子
case/default句を「値 -> 対応する式」の形式で表せます。アロー演算子では、句の末尾のbreak命令は不要となります。
(3)case値の複数列記
case句に、カンマ区切りで値を列記できます。従来のようにcase句そのものを列記する必要はありません。
[Caution]
switchの新構文は、執筆時点でPreviewの扱いです。Eclipseで利用した場合、以下のような警告が表示されます。
[プロジェクト・プロパティでプレビュー機能を有効にする]をクリックして、Preview機能を有効化してください。
▲Preview版に対する警告
また、Preview版を利用する場合は、@SuppressWarningsアノテーションでPreviewに対する警告を無効化しておきましょう。