2012-05-11 105 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; 
    } 
    } 
} 

上述代碼編譯得很好,並給出了預期的輸出。枚舉參考開關的情況下

我的問題是爲什麼當創建Color引用'c'時,我們需要通過枚舉的名稱(即Color.GREEN)來引用它,但在case塊中只有枚舉值就足夠了。它不應該是

case Color.RED: 

etc ???

回答

5

不,它不應該。 Java編譯器足夠聰明,知道您正在切換Color,因此語言允許使用這種快捷方式(並且正如Paul所說,需要它)。實際上,switch語句的整個編譯依賴於編譯器知道您正在接通的內容,因爲它會根據您指定的枚舉值的索引將交換機轉換爲跳轉表。只有在最近你才能夠打開非數字的東西,例如String

語言規範的相關部分是JLS Chapter 14.11

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

EnumConstantName: 
    Identifier 

如果你正在尋找了解爲什麼語言的設計會是這樣,那將是很難客觀回答。語言設計是微妙的,你必須考慮賦值語法是在添加枚舉支持之前幾年和幾年寫的。

+1

+1其實你*有*使用快捷鍵。請參閱[這篇有趣的文章](http://stackoverflow.com/q/8481635/697449)。 –

+0

@Paul:枚舉開關事件標籤**必須**是枚舉常量的_unqualified_名稱。 thnx ...明白了...... – WickeD

2

這是一種語言習慣。許多不同的語言都有枚舉,並不是所有的都可以讓你這樣做。在Java的情況下,由於命名空間,您可以執行Color.RED或其他任何操作。通過這樣做,您可以擁有多個具有相同變量名稱的枚舉,並且不會發生衝突。

switch語句不需要您執行Color.RED(並允許您簡單地聲明RED)的原因是switch語句知道它是Color類型的枚舉,並查找該名稱空間。

1

在線路

Color c = Color.GREEN; 

Color.因爲Java編譯器不推斷從聲明(Color c)所分配的表達式(Color.GREEN)的類型是必需的。出於同樣的原因,你必須寫:

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

,而不是簡單

ArrayList<String> x = new ArrayList(); 

(這實際上是部分固定在Java 7中,但是那是另一回事。)在switch(...)聲明中,種類然而,case是從switch的類型中推斷出來的。