与C / C ++不同,java enum是一个对象。枚举可用于switch case语句。无法使用类的对象。这背后有什么理由吗?
答案 0 :(得分:1)
将切换语句编译为跳转表。跳转表是一个表,它为每个case语句定义代码中的一行,特定大小写的代码位于该行中。例如:
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已经定义了这样的switch语句以及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