代码之家  ›  专栏  ›  技术社区  ›  Fostah

为什么您的转换语句数据类型不能长,Java?

  •  68
  • Fostah  · 技术社区  · 14 年前

    这是摘录 Sun's Java tutorials :

    开关与 byte , short , char int 基本数据类型。它还可以处理枚举类型(在类和继承中讨论)和一些特殊的类,这些类“包装”某些基元类型: Character , Byte , Short Integer (在简单数据对象中讨论)。

    一定有很好的理由 long 不允许使用基元数据类型。有人知道是什么吗?

    4 回复  |  直到 7 年前
        1
  •  44
  •   Neil Coffey    14 年前

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

    一个开关基本上可以用两种方式实现(或者原则上是一种组合):对于少数情况,或者值广泛分散的情况,一个开关基本上相当于一个临时变量上的一系列ifs(被打开的值必须只评估一次)。对于在数值上或多或少连续的情况下,使用一个交换表(Java中的TabLSwitCH指令),从而在表中有效地查找跳转的位置。

    原则上,这些方法都可以使用长值而不是整数。但我认为,平衡指令集和编译器的复杂性与实际需要可能只是一个实际的决定:真正需要切换一段时间的情况非常罕见,以至于必须重新编写一系列if语句,或以其他方式进行循环(如果所讨论的长值是clo,则可以接受)。SE一起,你可以在你的Java代码中切换INT的结果减去最低值。

        2
  •  20
  •   Donal Fellows    14 年前

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

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

    确切地说,2_ 许多 任何一个有足够长的时间来容纳更多的方法的案例和程序都将是非常可怕的!任何语言。(在任何语言的代码中,我所知道的最长的函数都有点超过6K sloc_ switch 如果你真的被困在 long 你应该只有一个 int 或者更少,那么你有两个真正的选择。

    1. 在哈希函数的主题上使用一些变量来压缩 长的 变成一个 int . 最简单的一个,只有在你输入错误的时候才使用,那就是铸造!更有用的方法是:

      (int) ((x&0xFFFFFFFF) ^ ((x >>> 32) & 0xFFFFFFFF))
      

      在打开结果之前。您将不得不解决如何转换您正在测试的案例。但事实上,这仍然是可怕的,因为它没有解决很多案件的真正问题。

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

      fwiw,我在很多年前做了这个(我们在项目的一部分中切换到了新发布的J2SE1.2),在构建用于模拟大规模并行硬件的自定义字节码引擎时(不,由于涉及的值和执行模型截然不同,重用JVM将不适合),它极大地简化了代码关系。向大人物致敬 转换 代码的C版本正在使用。

    重申带回家的信息,希望 转换 在一 长的 这表明要么你的程序中有错误的类型,要么你正在构建一个包含大量变化的系统,你应该使用类。在任何一种情况下都需要重新思考。

        3
  •  3
  •   JRL    14 年前

    因为查阅表格索引必须是32位。

        4
  •  -9
  •   Dimitris Andreou    14 年前

    在32位体系结构中,长的用两个词表示 . 现在,想象一下,如果由于同步不足,switch语句的执行会观察到一个较长的段,其中一个写的32位高位,另一个写的32位低位!它可以尝试去……谁知道在哪里!基本上是随机的。即使这两个写都代表了switch语句的有效事例,它们有趣的组合可能既不会导致第一个也不会导致第二个--或者更糟的是,它可能导致另一个有效但不相关的事例!

    至少对于一个int(或更小的类型),无论您搞砸了多少,switch语句至少会读取一个 有人真的写了 而不是“空气稀薄”的值。

    当然,我不知道真正的原因(已经15年多了,我没注意那么久!)但是如果你意识到这样一个构造是多么不安全和不可预测,你会同意这是一个 很好的理由 不到 曾经 打开long(并且只要-pun预期-将有32位机器,这个原因将保持有效)。