为什么不为null编译时间常数?[英] Why isn't null a compile time constant?

问题描述

所以如果我有一个static final Object CONSTANT = null,则出于某种原因,如果我引用在另一个代码(如doSomething(CONSTANT))中,则它不会在编译期间内衬在代码上.所以编译后,而不是doSomething(null),它将是doSomething(CONSTANT).

推荐答案

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

它的感觉是Object实例(一般)具有语义上的重要对象标识,其将其与其他Object实例区分开来.此对象标识不能在类文件中编码...或至少,它不能以当前的类文件格式编码. (如果它可以,会有各种各样的问题......)

值null可以(理论上)作为一个特殊情况,除了没有大量的点.具体而言,在语言角度来看,您不能在任何上下文中使用null.例如:

  • 您不能拥有null作为case表达式.
  • 由于==为引用类型而不是常量表达式,您无法将其用于Java"条件编译"成语,涉及具有常量表达式的if作为条件. (除了null == null不是有用的条件......)

就联系而言,虽然"常量"不能在字节码内联合(因为JLS规则有关"常量表达式"是什么),但是JIT编译器的优化器将被允许执行此操作,而 5月实际上是这样做...如果有切实的性能效益.

参考:

其他推荐答案

在您的情况下,常量不是编译时间常数.

编译时间常数是常量,其值在编译时是已知的 它不会进一步更改,然后编译器替换到处都是常量名称 在代码中具有其值.

通常由最终声明的原始类型或字符串文字被编译器被编译为编译时间常数. 示例:

final int a=10;
final String constant ="this is compile time const";

这些都是编译时间常量,我们可以在交换机语句的标签中使用编译时间常量表达式

非编译时间常量

的示例
final String xyz = new String("this is not a compile time const");

此处XYZ字符串对象不是编译时间常量.因为此"XYZ"字符串对象将在运行时创建,并且在此编译器仅知道该引用不是字符串对象.

相同适用于您的静态最终对象常量= null

accroding to JLS

null文字的类型是null类型;它的值是null引用.

本文地址:https://www.itbaoku.cn/post/978772.html