Java 为什么编译时常量仅限于原语和字符串?
这只是出于好奇,我想我也知道答案,但只是想验证和了解其他观点Java 为什么编译时常量仅限于原语和字符串?,java,compiler-optimization,Java,Compiler Optimization,这只是出于好奇,我想我也知道答案,但只是想验证和了解其他观点 说明编译时常量仅限于基元类型和字符串。为什么即使我将某种类型的引用a声明为final(final a aObj=new a();)?是因为类尚未加载还是其他原因?JDK中还有那么多其他的不可变类,为什么不包括这些呢?因为对象(可变或不可变)的构造可能会产生副作用,这些副作用必须在运行时发生。字符串是一个例外,因为Java语言假定这永远不会发生。它也是例外,因为它是Java语言规范所依赖的少数几个类之一;i、 e.在处理文字和某些类型的
说明编译时常量仅限于基元类型和字符串。为什么即使我将某种类型的引用
a
声明为final
(final a aObj=new a();
)?是因为类尚未加载还是其他原因?JDK中还有那么多其他的不可变类,为什么不包括这些呢?因为对象(可变或不可变)的构造可能会产生副作用,这些副作用必须在运行时发生。字符串是一个例外,因为Java语言假定这永远不会发生。它也是例外,因为它是Java语言规范所依赖的少数几个类之一;i、 e.在处理文字和某些类型的switch
语句(Java 6及更高版本)的语义方面
后者与“编译时常量”特别相关,因为开关臂表达式必须是编译时常量表达式
还有几个其他因素:
- 对于编译器和运行时JVM来说,编译时常量的处理更为复杂
- 当以增量方式编译代码时,编译时常量可能会有意外的行为,因此限制这种行为发生的情况是有益的(对于程序员而言)
- 使更多类型符合编译时常量的条件可能没有多大实际好处