2015-09-25 29 views
0

與C/C++不同,java枚舉是一個對象。枚舉可以用在switch case語句中。作爲類的對象不能使用。這背後有什麼理由嗎?爲什麼對象不能在switch語句中使用,因爲可以使用枚舉

+1

沒有一個一般情況下O(1)實現開關的那甚至可以對任意對象,當然不是你可以在編譯時建立的。 –

+0

'字符串'也可以在交換機中使用。 – ZhongYu

+0

對於一般對象,'if - else if - ...'沒那麼糟;甚至可能比'switch-case'好看。 – ZhongYu

回答

1

開關語句被編譯到跳轉表中。跳轉表是一個表格,它爲每個案例語句定義代碼中的一行,特定案例的代碼位於該行中。例如:

switch(a) { 
    case 0: // Do 0 
    case 1: // Do 1 
    case 2: // Do 2 
} 

被編譯爲:

lookupswitch { 
    0: 17 
    1: 33 
    2: 65 
} 
... 
line 17: // Do 0 
... 
line 33: // Do 1 
... 
line 65: // Do 2 

約跳轉表的好處是,在比較指令被省略,您可以在一個陣列(這裏有時使用它們:{17, 33,65}),省略了比較。

由於跳轉表中的索引是一個數字,因此您不能在此放置函數(自己的對象需要使用equals函數)。字符串在編譯時轉換爲它們的hash codes以在switch語句中比較它們。枚舉也可以通過它們的ordinal number輕鬆索引。

Java已經定義了像這樣的開關語句以及用於if/else語句的所有其他用法。

Java語言參考:http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.11
Java實現參考:http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-3.html#jvms-3.10
維基百科的文章關於跳轉表:https://en.wikipedia.org/wiki/Branch_table

+0

由於枚舉是對象,所以必須調用enum類的ordinal方法來獲得枚舉對象的序號。您能否詳細解釋java如何在不調用ordinal函數的情況下執行此操作。 –

相關問題