1. ホーム
  2. java

[解決済み] なぜswitch文ではenum値を完全修飾できないのですか?

2022-02-14 13:52:01

質問

(注:質問を編集したもので、事前の意図が明確ではありませんでした)

このコードを考えてみましょう。

public final class Foo
{
    private enum X
    {
        VALUE1, VALUE2
    }

    public static void main(final String... args)
    {
        final X x = X.VALUE1;

        switch (x) {
            case VALUE1:
                System.out.println(1);
                break;
            case VALUE2:
                System.out.println(2);
        }
    }
}

このコードは正常に動作します。

ところが、置き換えてみると

case VALUE1: // or VALUE2

を使っています。

case X.VALUE1: // or X.VALUE2

とすると、コンパイラは文句を言います。

java: /path/to/Foo.java:whatever: enum switch case label must be an unqualified name of an enumeration constant(enumスイッチケースのラベルは列挙定数の非限定名でなければなりません。

SO 回答はこちら をJLSから引用しています。

<ブロッククオート

(定数のインライン化が必要な理由の1つは、switch文では各ケースで定数が必要であり、その定数値が2つと同じでない可能性があるためです)。コンパイラはコンパイル時にswitch文の定数値が重複していないかチェックしますが、クラスファイル形式ではケース値のシンボリックリンクは行いません)。

しかし、これでは納得がいきません。私が知る限りでは VALUE1X.VALUE1 は全く同じです。引用された文章では私には全く説明がつきません。

JLSのどこで、次のように定義されているのでしょうか? enum の値は switch 文はこのように書かなければならないのですか?

どのように解決するのですか?

SwitchLabel が期待するのは EnumConstantName は、enum定数識別子として定義されています。 であり、非限定である :

EnumConstantです。
アノテーション <サブ オプト 識別子の引数 <サブ opt クラス本体 <サブ opt