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

新手上路,请多包涵

以下是 Sun 的 Java 教程 的摘录:

A SWITS可与 byteshortchar int 它还适用于枚举类型(在类和继承中讨论)和一些“包装”某些原始类型的特殊类: Character , Byte , ShortInteger (在简单数据对象中讨论)。

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

原文由 Fostah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

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

switch 本质上可以通过两种方式(或原则上,一种组合)实现:对于少数情况,或者值广泛分散的情况,switch 本质上等同于临时变量上的一系列 ifs(被打开的值只能被评估一次)。对于中等数量的值或多或少连续的情况,使用切换表(Java 中的 TABLESWITCH 指令),从而有效地在表中查找要跳转到的位置。

这些方法中的任何一种原则上都可以使用长值而不是整数。但我认为平衡指令集和编译器的复杂性与实际需要可能只是一个实际的决定:真正需要切换 long 的情况很少见,因此不得不重新编写为一系列 IF 语句,或以其他方式解决问题(如果有问题的 long 值靠得很近,您可以在 Java 代码中切换减去最低值的 int 结果)。

原文由 Neil Coffey 发布,翻译遵循 CC BY-SA 2.5 许可协议

因为他们没有在字节码中实现必要的指令,而且你 真的 不想写那么多案例,无论你的代码是多么“生产就绪”……

[编辑:摘自对此答案的评论,并在背景上添加了一些内容]

确切地说,2³² 是 很多 情况,任何程序的方法都足够长以容纳比这更多的情况,这将是非常可怕的!用任何语言。 (我所知道的任何语言的任何代码中最长的函数都超过 6k SLOC – 是的,它很大 switch 而且它真的难以管理。)如果你真的坚持有一个 long 你应该只有一个 int 或更少,那么你有两个真正的选择。

  1. 使用哈希函数主题的一些变体将 long 压缩为 int 。最简单的一种,仅在类型错误时使用,就是强制转换!这样做更有用:
    (int) ((x&0xFFFFFFFF) ^ ((x >>> 32) & 0xFFFFFFFF))

在打开结果之前。您还必须弄清楚如何转换您正在测试的案例。但实际上,这仍然很糟糕,因为它没有解决很多案例的真正问题。

  1. 如果您正在处理大量案例,一个更好的解决方案是将您的设计更改为使用 Map<Long,Runnable> 或类似的东西,以便您查找如何分派特定值。这允许您将案例分成多个文件,当案例数量变大时,这更容易管理,尽管组织所涉及的实现类主机的注册确实变得更加复杂(注释可能有助于您自动生成注册码)。

    FWIW,我在很多年前(我们在项目中途切换到新发布的 J2SE 1.2)时构建了一个用于模拟大规模并行硬件的自定义字节码引擎(不,重用 JVM 是不合适的,因为根本涉及不同的价值和执行模型)并且它极大地简化了相对于代码的 C 版本使用的大 switch 的代码。

重申要点信息,想要 switchlong 上表明你的程序类型错误或者你正在构建一个系统涉及的变化太多,您应该使用类。在这两种情况下都需要重新考虑。

原文由 Donal Fellows 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题