gpt4 book ai didi

java - 为什么 null 不是编译时常量?

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:03 24 4
gpt4 key购买 nike

因此,如果我有一个 static final Object CONSTANT = null,出于某种原因,如果我在另一段代码(如 doSomething(CONSTANT))中引用它,它就不会在编译期间内联到代码中。因此,编译后不是doSomething(null),而是doSomething(CONSTANT)

最佳答案

您的 CONSTANT 不是编译时常量,因为 JLS 它不是。唯一可以在常量表达式中使用的类型是原始类型和 String

它的意思是,Object 实例(通常)具有语义上重要的对象标识,可以将其与其他 Object 实例区分开来。这个对象标识不能在类文件中编码……或者至少,它不能用当前的类文件格式编码。 (如果可以的话,还会有各种各样的其他问题......)

null 可以(理论上)作为一种特殊情况处理,只是没有太多意义。具体来说,您不能在任何从语言角度需要(或有利)“编译时间常量”的上下文中使用 null。例如:

  • 不能将 null 作为 case 表达式。
  • 由于引用类型的 == 不是常量表达式,因此您不能将它用于涉及带有常量表达式的 if 的 Java“条件编译”习语作为条件。 (而且 null == null 不是有用的条件...)

就内联而言,虽然“常量”不能在字节码中内联(因为 JLS 规则关于什么是“常量表达式”),JIT 编译器的优化器将被允许这样做,并且 < em>可能实际上会这样做...如果有切实的性能优势。

引用:

关于java - 为什么 null 不是编译时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com