Java和交换机外壳
有人知道为什么Java不允许切换大于整数的数字吗?这背后有什么技术原因吗?可能是因为在一个开关中有超过整数最大值的情况是非常糟糕的编程 如果要切换长变量,只需在整数空间中投影它们。如前所述,switch可用于byte、short、char和int基元数据类型。它还适用于枚举类型和一些特殊类,这些类“包装”某些基本类型:字符、字节、短字符和整数 Java switch语句被编译成。这两种字节码都要求大小写值是唯一的、32位的整数编译时常量 tableswitch和lookupswitch指令都包括一个默认分支偏移量和一组可变长度的大小写值/分支偏移量对。Java和交换机外壳,java,Java,有人知道为什么Java不允许切换大于整数的数字吗?这背后有什么技术原因吗?可能是因为在一个开关中有超过整数最大值的情况是非常糟糕的编程 如果要切换长变量,只需在整数空间中投影它们。如前所述,switch可用于byte、short、char和int基元数据类型。它还适用于枚举类型和一些特殊类,这些类“包装”某些基本类型:字符、字节、短字符和整数 Java switch语句被编译成。这两种字节码都要求大小写值是唯一的、32位的整数编译时常量 tableswitch和lookupswitch指令都包括
这两条指令都从堆栈中弹出键(switch关键字后面括号中表达式的值)。
将该键与所有案例值进行比较:
- 如果找到匹配项,则采用与案例值关联的分支偏移量李>
- 如果未找到匹配项,则采用默认分支偏移量李>
我的猜测是,long作为一种有效的switch表达式类型被删除了,因为与long变量上的操作相关。Scala,一种构建在JVM之上的语言,允许您定义自己的case类,可以在switch语句中使用。因此,在switch语句中使用long、double或string肯定是可能的 我不知道它有多复杂,有多有效。对于简单类型,编译器只计算要在表上跳转的偏移量。对于更复杂的类型,情况绝对不是这样
我想答案与java的设计时间和设计者试图实现的目标有关。Java最初的目标是设计一个“更好的C++”,可以在许多环境中移植。我可以理解为什么复杂类型上的开关不适合它。如果您发现本机java开关构造的限制太大,请看一看允许通过与一些hamcrest匹配器匹配来声明性地切换任何对象的方法。这是实现细节。不是这个选择的真正原因。请不要否决这个答案!它解释了为什么Java语言设计者认为将switch语句限制为32位类型是合理的。这不是一个原因,而是猜测。将long投影到整数空间也会破坏使用long的目的。这将是一个相当愚蠢的原因,想象一下需要切换一些长位序列。我不认为这是原因。如果是这样的话,那么如果其他人也应该受到限制,对吗?我认为这与VonC指出的处理器寻址模式有关(因为switch不像else结构那样编译成相同的字节码)。