與C/C++不同,java枚舉是一個對象。枚舉可以用在switch case語句中。作爲類的對象不能使用。這背後有什麼理由嗎?爲什麼對象不能在switch語句中使用,因爲可以使用枚舉
0
A
回答
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函數的情況下執行此操作。 –
相關問題
- 1. 爲什麼我的枚舉不能在switch語句中工作?
- 2. 爲什麼我不能在switch語句中使用NSInteger?
- 3. C#:爲什麼在一個switch語句?枚舉是整數
- 4. 枚舉在switch語句
- 5. 我可以使用@switch和枚舉嗎?
- 6. 的Java枚舉switch語句
- 7. 在switch語句中使用枚舉類型
- 8. 爲什麼java.util.Calendar不使用枚舉?
- 9. 爲什麼我不能在Java枚舉中使用foreach?
- 10. 爲什麼Switch語句只能使用true關鍵字?
- 11. Let子句因爲它爲什麼可以使用此連接語句
- 12. 爲什麼我不能在範圍內的switch語句中使用「常量」?
- 13. 爲什麼我不能在switch語句中使用元組常量
- 14. 可以使用而不是在switch語句中使用break嗎?
- 15. 我可以在不使用switch語句的情況下測試枚舉值是否爲特定情況嗎?
- 16. 使用枚舉和switch語句中的一類
- 17. C++使用特定的類和枚舉範圍switch語句中
- 18. 使用JSON.NET爲jQGrid枚舉JSON對象
- 19. 使用枚舉作爲對象ID
- 20. 爲什麼使用switch語句的函數不需要返回
- 21. 爲什麼枚舉包括可枚舉
- 22. PowerMockito枚舉在Switch語句拋出NPE
- 23. 可以使用switch語句來確定對象的類別嗎?
- 24. 爲什麼我不能使用|| C++ Switch語句中的OR運算符?
- 25. 在switch語句中可以使用if語句嗎?
- 26. Java 1.5 Enum:爲什麼我不能在1.5枚枚舉中使用'findBy'?
- 27. 使用對象替換switch語句
- 28. 爲什麼Apple使用NSString對象作爲參數而不是枚舉?
- 29. 爲什麼使用靜態枚舉?
- 30. 爲什麼Phobos使用枚舉常量?
沒有一個一般情況下O(1)實現開關的那甚至可以對任意對象,當然不是你可以在編譯時建立的。 –
'字符串'也可以在交換機中使用。 – ZhongYu
對於一般對象,'if - else if - ...'沒那麼糟;甚至可能比'switch-case'好看。 – ZhongYu