为什么对象不能在switch语句中使用,因为可以使用枚举

时间:2015-09-25 17:26:39

标签: java enums switch-statement

与C / C ++不同,java enum是一个对象。枚举可用于switch case语句。无法使用类的对象。这背后有什么理由吗?

1 个答案:

答案 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