小编典典

为什么null不为编译时间常数?

java

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


阅读 220

收藏
2020-11-23

共1个答案

小编典典

CONSTANT不是编译时间常数,因为JLS 表示 不是。只能在常量表达式中使用的类型是基本类型和String

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

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

  • 你不能有null这样的case表达。
  • 由于==引用类型不是常量表达式,因此您不能将其用于涉及if以常量表达式为条件的Java“条件编译”惯用语。(而且null == null不是一个有用的条件…)

就内联而言,虽然不能在字节码中内联“常量”(因为有关“常量表达式”的JLS规则),但允许JIT编译器的优化器执行此操作,并且实际上 可以
这样做…如果有明显的绩效收益。

参考:

2020-11-23