LoginSignup
2
1

More than 3 years have passed since last update.

【Java】switch文のcaseに文字列入れる場合は定数式にする必要がある

Posted at

結構今さら感があると思うのだが、知らなかったので自分用のメモ。
すぐ忘れそうだが。

こんな例はコンパイルエラーになります

例えば

public class SwitchTest {
    static final String ddd = "ddd";
    static String ccc = "ccc";
    public static void main(String[] args) {

        String bbb = "bbb";

        final String eee = "eee";

        switch(args[0]) {
            case "aaa":
                System.out.println("aaa");
                break;
            case bbb:
                System.out.println("bbb");
                break;
            case ccc:
                System.out.println("ccc");
                break;
            case ddd:
                System.out.println("ddd");
                break;
            case eee:
                System.out.println("eee");
                break;
            default:
                System.out.println("default");
                break;
        }
    }

というコードを書いたとする。
しかし、これはコンパイルエラーになる。
ちなみに以下のようなエラーが出る。


SwitchTest.java:14: エラー: 定数の文字列式が必要です
            case bbb:
                 ^
SwitchTest.java:17: エラー: 定数の文字列式が必要です
            case ccc:
                 ^

要するにcaseにいれる文字列は「定数」でなければならない(final句が必要)ということのようだ。
実際、ddd(static final)とeee(final)はコンパイルエラーとして抽出されていない。
また、caseに直接文字列を書く("aaa")と、ここでいう「定数」の扱いになるらしくてコンパイルエラーとして抽出されない。
まあ「変数」じゃあないもんね。。

なお、コンパイルエラーとして返ってきた出力をそのまま使っているので「定数」というキーワードを持ち出しているが、正確に言うとこれは「定数」という呼称?表現?ではないようだ。
この辺はここに書かれている。
Constant Expressionだから日本語にすると「定数式」というのが正しいのかな?
例えばこれによると+を用いた演算も「定数式」にあたるらしく、

...
    case "aaa" + "xxx":
        System.out.println("aaa+xxx");
        break;
...

こういうのもコンパイルは通る。
ただ結合対象にfinalがついてない変数(例えば上記で言うbbb)を使って"aaa" + bbbとかするとやっぱりコンパイルエラーになる。

switch文を文字列で使うことがあんまりなかったので今まで知らなかった。
勉強になりました。(?)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1