Java和交换机案例

时间:2008-11-21 08:56:07

标签: java

有没有人知道为什么Java不允许你打开大于整数的数字?这背后有任何技术原因吗?

5 个答案:

答案 0 :(得分:23)

如上所述here,switch使用byte,short,char和int原始数据类型。它还适用于枚举类型和一些“包装”某些基本类型的特殊类:Character,Byte,Short和Integer。

Java switch语句被编译为JVM bytecode tableswitch or lookupswitch。这两个字节码都要求case值是唯一的,32位,整数,编译时常量。

tableswitch和lookupswitch指令都包括一个默认的分支偏移和一组可变长度的case值/分支偏移对。
两个指令都从堆栈中弹出键(紧跟在switch关键字后面的括号中的表达式的值) 将密钥与所有案例值进行比较:

  • 如果找到匹配,则采用与案例值关联的分支偏移量。
  • 如果未找到匹配项,则采用默认分支偏移量。

即使以上代表实现细节,我相信用于切换的类型是与控制流的高效字节码兼容的类型,它可能是一个重要的部分,因为这个选择。

如前所述Java Bug

  

我认为您可以允许Java switch语句包含其他类型的值,并编译一个switch语句,该语句将这些值中的一种用于其他字节码,例如ifs和gotos序列。但是我们必须仔细检查所有的switch语句,以确定它是否会被编译成快速切换字节码或if-elses的慢速序列。

正如其他Java bug

所述
  

'switch'语句可以使用函数表调度和/或二叉树搜索来匹配case语句,而不仅仅是按顺序逐个测试它们。

答案 1 :(得分:1)

Scala是一种构建在JVM之上的语言,允许您定义自己的case类,可以在switch语句中使用。因此,在switch语句中使用longs,double或strings肯定是可能的。

然而,我不知道它有多复杂和多么有效。对于简单类型,编译器只计算要在表上跳转的偏移量。对于更复杂的类型,情况绝对不是这样。

我认为答案与java设计的时间和设计师试图实现的目标有关。 Java最初的目标是设计一个“更好的C ++”,可在许多环境中移植。我可以理解为什么复杂类型的开关不适合它。

答案 2 :(得分:0)

我的猜测是,由于长变量may not be atomic上的操作事实/与之相关,因此长时间被删除为有效的切换表达式类型。

答案 3 :(得分:0)

如果您发现本机java开关构造过于局限,请查看允许通过将它们与某些hamcrest匹配器进行匹配来声明性地切换任何对象的lambdaj Switcher

答案 4 :(得分:-8)

也许是因为在交换机中拥有超过整数最大个案的编程真的很糟糕?

如果要切换长变量,只需在整数空间中进行投影即可。