2012-05-11 9 views
7
enum Color {RED, GREEN, BLUE}; 
class SwitchEnum 
{ 
    public static void main(String[] args) 
    { 
    Color c = Color.GREEN; 
    switch(c) 
    { 
     case RED: 
     System.out.println("red"); 
     break; 
     case GREEN: 
     System.out.println("green"); 
     break; 
     case BLUE: 
     System.out.println("blue"); 
     break; 
    } 
    } 
} 

上記のコードは正しくコンパイルされ、期待される出力が得られます。スイッチの場合のenum参照

私の質問は、カラーリファレンス 'c'を作成するときにenumの名前(Color.GREEN)を参照する必要がありましたが、ケースブロックではenum値のみが十分であるということです。されていないはずです

case Color.RED: 

など???

答えて

5

いいえ、そうしてはいけません。 Javaコンパイラは、あなたがColorに切り替えていることを知るのに十分にスマートなので、言語はこのショートカットを可能にします(そしてポールノートではそれが必要です)。実際、switch文のコンパイル全体は、スイッチが指定したenum値のインデックスに基づいてジャンプテーブルに変換されるため、コンパイラがスイッチしているものを知っているかどうかによって異なります。ごく最近になって、Stringのような数値以外のものに切り替えることができました。

言語仕様の関連部分がJLS Chapter 14.11である:あなたが言語はそれがあったように設計された理由についての洞察を探しているなら

... 
SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

、それはハードになるだろう客観的に答えてください。言語設計は微妙なので、enumサポートが追加されるまでに、割り当て構文が何年も何年も書かれていると考える必要があります。

+1

+1実際には、ショートカットを使用する必要があります。たとえば、[この興味深い投稿](http://stackoverflow.com/q/8481635/697449)を参照してください。 –

+0

@Paul:enumスイッチのケースラベル**は、enum定数の_unqualified_ nameでなければなりません。 thnx ...それを得た... – WickeD

2

言語規約です。多くの言語には列挙型がありますが、すべてではありません。 Javaの場合、名前空間のためにColor.REDなどを行うことができます。これにより、同じ変数名を持つ複数の列挙型を持つことができ、衝突しません。

switch文がColor.REDを必要とせず、単にREDを指定できる理由は、switch文がColor型の列挙型であることを知り、その名前空間を参照するためです。

1
ラインにおいて

Color c = Color.GREEN; 

Javaコンパイラは、宣言(Color c)から割り当てられた式(Color.GREEN)の種類を推測しないのでColor.が必要です。同じ理由で、次のように記述する必要があります。

ArrayList<String> x = new ArrayList<String>(); 

はなく、単に

ArrayList<String> x = new ArrayList(); 

(これは実際には一部のJava 7に固定されているが、それはまた別の話です。)switch(...)文の種類でしかしcaseswitchのタイプから推測されます。

関連する問題