为什么你的switch语句数据类型不能很长,Java?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

以下是Sun Java教程的摘录:

一种开关用的工作原理byteshortchar,和int原始数据类型。它还与枚举类型(在类和继承讨论)和少数特殊类作品是“包装”某些基本类型:CharacterByteShort,和Integer(在简单的数据对象讨论)。

为什么long不允许原始数据类型必须有充分的理由。有人知道这是什么吗?

提问于
用户回答回答于

我认为在某种程度上,这可能是基于典型使用开关的任意决定。

一个交换机可以基本上以两种方式实现(或者原则上是一种组合):对于少数情况或其值分布很广的情况,交换机本质上等价于临时变量上的一系列if(打开的值只能评估一次)。对于中等数量的或多或少连续值的情况,使用切换表(Java中的TABLESWITCH指令),从而在表中有效地查找跳转到的位置。

原则上这两种方法中的任何一种都可以使用长整型值而不是整数。但我认为这可能只是一个实际的决定,以平衡指令集和编译器的复杂性与实际需求:您真的需要切换很长时间的情况非常罕见,必须重新编写为一系列的IF语句,或者以其他方式工作(如果所讨论的长整型值紧密相连,则可以在Java代码中切换减去最小值的整型结果)。

用户回答回答于

因为他们没有在字节码中实现必要的指令,而且你真的不想写这么多的情况,所以无论你的代码是如何“生产就绪”的......

确切地说,2³²是很多情况,任何有足够长的方法的程序都会变得非常可怕!用任何语言。(我在任何语言的任何代码中知道的最长函数有点超过6k SLOC - 是的,这是一个很大的问题switch- 它确实难以管理。)如果你真的坚持long要求只有一个int或更少的地方,那么你有两个真正的选择。

  1. 使用散列函数的主题上的一些变体压缩long成一个int。最简单的一个,只有当你的类型错误时才使用,就是投!更有用的是做到这一点: (int) ((x&0xFFFFFFFF) ^ ((x >>> 32) & 0xFFFFFFFF)) 然后打开结果。你必须弄清楚如何改变你正在测试的案例。但实际上,这仍然很糟糕,因为它没有解决很多案件的真正问题。
  2. 如果你处理的案例数量非常多,那么更好的解决方案就是将您的设计更改为使用Map<Long,Runnable>某种类似的设备,以便查找如何分配特定的值。这使您可以将案例分为多个文件,在案例数量变大时更容易管理,尽管组织相关实施类主机的注册变得更加复杂(注释可能有助于让您自动构建注册码)。 FWIW,我在很多年前就已经这么做了(我们切换到新发布的J2SE 1.2项目的一部分),当构建一个用于模拟大规模并行硬件的自定义字节码引擎时(不,重用JVM由于从根本上不合适涉及不同的价值和执行模式),并且相对于代码switch的C版本所使用的代码来说,它极大地简化了代码。

希望得到switch一个信息,long表明您的程序中有错误的类型,或者你正在构建一个包含多种变体的系统,你应该使用类。无论是哪种情况,都需要重新思考。

扫码关注云+社区