2016-06-21 74 views
0

我知道這是一個微不足道的問題,但這完全引起我的興趣;當聲明爲內部類時,switch語句中枚舉值的行爲

作爲(非靜態)不能沒有即使在外層類它的實例被直接訪問成員內部類,

和同時訪問靜態常量u必須與外部類hai.x範圍; 但在「使用枚舉開關作爲case常量」的情況下,它似乎是另一種方式; 看dostuff2()

情況RED:作品,但情況value.RED給出錯誤枚舉開關case標籤必須是枚舉常量的非限定名稱

我知道上述聲明說,這一切;我只是好奇

如果我們假設編譯器墊'價值。 「所有的開關常數.. 爲什麼這是不枚舉正常declartion的情況下,也值v = RED

public class enumvalues 
{ 
    public enum values 
    { 
     RED,GREEN,VALUE  
    } 
    public class hai 
    { 
     static final int x=90;      
    } 
    public static class statichai 
    { 

    } 
    public static void main(String []args) 
{ 

} 

    public void dostuff2(values v) 
    { 
     // v =RED this is illegal 

     // System.out.println(RED); this will not compile because it cannot be accessed directly 
     // System.out.println(x); this will not compile because it cannot be accessed directly 



     switch(v) 
     { 
      case RED: //use of value.RED is strictly forbidden 
      System.out.println("red"); 
     } 
    } 
} 
+0

您是否嘗試過'value.RED'或'values.RED'? (在後者的'values'中注意's') – Abubakkar

+0

枚舉值通常必須是合格的。僅用於開關情況下,提供了簡短的符號。 _這就是全部._ –

+0

這只是Java編程語言的一個規則。 「爲什麼」這個問題沒有明確的答案。因爲Java語言的設計者認爲這是一個好主意。已經清楚你打開哪種類型的枚舉類型,因此在'case'中使用'values.RED'而不是'RED'只會是不必要的冗長。 – Jesper

回答

1

,因爲這需要創造枚舉進行檢查特例。 考慮另一個例子

interface SomeInterface{} 
enum Values implements SomeInterface {RED}; 
enum MoreValues implements SomeInterface {RED}; 

public void dostuff2(SomeInterface value) 
{ 
value = RED; 
} 

這是很相似,你的代碼到你的,dostuff2是完全相同。正如編譯器引擎蓋下的那樣,它們只是普通的類。 所以要處理你的例子,你需要添加特殊情況來處理枚舉。