这只是出于好奇,我想我也知道答案,但只是希望验证并了解其他观点。
Compile time constants and variables表示编译时常量仅限于基本类型和字符串。为什么这样,即使我将某些类型A
的引用声明为final
(final A aObj = new A();
)?是因为类还没有加载或其他东西? JDK中有许多其他不可变类,Complete List of immutable JDK classes?,为什么没有包含这些类?
答案 0 :(得分:2)
因为对象(可变或不可变)的构造可能具有必须在运行时发生的副作用。字符串是例外,因为Java语言假定这种情况永远不会发生。它也是例外,因为它是Java语言规范所依赖的少数几个类之一;即在处理文字时,以及某些switch
语句(Java 6及更高版本)的语义。
后者与"编译时常量"特别相关,因为切换臂表达式需要是编译时常量表达式。
其他几个因素:
处理编译时常量对于编译器和运行时JVM来说都更复杂
编译时常量在以递增方式编译代码时可能会出现意外行为,因此限制发生该行为的情况是有益的(对程序员而言),
使更多类型有资格成为编译时常量可能没什么实际好处。