这只是出于好奇,我想我也知道答案,但只是想验证并了解其他观点。
Compile time constants and variables告诉编译时常量仅限于原始类型和字符串。为什么即使我将某种类型 A
的引用声明为 final
( final A aObj = new A();
)?是因为类还没有加载还是其他原因? JDK 中还有很多其他不可变类,Complete List of immutable JDK classes? ,为什么那些不包括在内?
最佳答案
因为对象(可变或不可变)的构造可能会产生必须在运行时发生的副作用。 String 是个异常(exception),因为 Java 语言认为这种情况永远不会发生。它的另一个特殊之处在于它是 Java 语言规范所依赖的少数类之一;即在文字处理中,以及某些 switch
语句的语义(Java 6 及更高版本)。
后者与“编译时常量”特别相关,因为开关臂表达式需要是编译时常量表达式。
其他一些因素:
编译时常量的处理对于编译器和运行时 JVM 来说都更加复杂
在增量编译代码时,编译时常量可能会出现意外行为,因此限制发生该行为的情况是有益的(对于程序员而言),
使更多类型有资格成为编译时常量可能没有太多实际好处。
关于java - 为什么编译时常量仅限于原语和字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34429097/