Javaの分岐構造-switch


if文に加えて、条件判定があり、switchは、ある表現の結果に基づいて、それぞれ異なる分岐を実行する。
例えば、ゲームにおいて、ユーザにオプションを選択させる。
  • シングルモード
  • マルチモード
  • 退出ゲーム
  • このとき、switch文が役に立ちます。switch文は、switch(表現)によって計算された結果、一致したcaseの結果にジャンプし、breakが実行を終了するまで、後続の文を実行し続ける。
    public class Main {
        public static void main(String[] args) {
            int option = 1;
            switch (option) {
            case 1:
                System.out.println("Selected 1");
                break;
            case 2:
                System.out.println("Selected 2");
                break;
            case 3:
                System.out.println("Selected 3");
                break;
            }
        }
    }
    
    optionの値はそれぞれ1、2、3であり、実行結果を観察する。optionの値が任意のcase、例えばoption = 99に一致していない場合、switchのステートメントは実行されない。この場合、switch文にdefaultを追加してもよく、caseと一致していない場合は、defaultを実行する。
    public class Main {
        public static void main(String[] args) {
            int option = 99;
            switch (option) {
            case 1:
                System.out.println("Selected 1");
                break;
            case 2:
                System.out.println("Selected 2");
                break;
            case 3:
                System.out.println("Selected 3");
                break;
            default:
                System.out.println("Not selected");
                break;
            }
        }
    }
    
    switch文をif文に翻訳すれば、上記のコードは以下の通りである。
    if (option == 1) {
        System.out.println("Selected 1");
    } else if (option == 2) {
        System.out.println("Selected 2");
    } else if (option == 3) {
        System.out.println("Selected 3");
    } else {
        System.out.println("Not selected");
    }
    
    複数の==が判断する場合には、switchを用いて構成がより明確である。
    なお、上記の「翻訳」はswitch文の中でcase文ごとに正しくbreak文を作成してこそ適切である。switchを使用する場合、カッコつけcase文がないことに注意してください。また、{}文は「透過性」を有しています。書き落としcaseは思わぬ結果をもたらすでしょう。
    public class Main {
        public static void main(String[] args) {
            int option = 2;
            switch (option) {
            case 1:
                System.out.println("Selected 1");
            case 2:
                System.out.println("Selected 2");
            case 3:
                System.out.println("Selected 3");
            default:
                System.out.println("Not selected");
            }
        }
    }
    
    breakの場合は、option = 2Selected 2Selected 3Not selectedから順に出力される。これは一致からcase 2までで、後続のステートメントは全部実行される。ですから、いつでも忘れずに書いてください。
    いくつかのbreak文が同じブロックのセットで実行されている場合、このように書くことができる。
    public class Main {
        public static void main(String[] args) {
            int option = 2;
            switch (option) {
            case 1:
                System.out.println("Selected 1");
                break;
            case 2:
            case 3:
                System.out.println("Selected 2, 3");
                break;
            default:
                System.out.println("Not selected");
                break;
            }
        }
    }
    
    break文を使用する場合、case文がある限り、switchの順序はプログラム論理に影響しません。しかし、自然の順に並べて読むのが楽です。break文はまた文字列にマッチすることができる。文字列が一致する場合は、「内容が等しい」と比較します。たとえば:
     public class Main {
        public static void main(String[] args) {
            String fruit = "apple";
            switch (fruit) {
            case "apple":
                System.out.println("Selected apple");
                break;
            case "pear":
                System.out.println("Selected pear");
                break;
            case "mango":
                System.out.println("Selected mango");
                break;
            default:
                System.out.println("No fruit selected");
                break;
            }
        }
    }