java - 为什么编译时常量仅限于原语和字符串?

标签 java compiler-optimization

这只是出于好奇,我想我也知道答案,但只是想验证并了解其他观点。

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/

相关文章:

java - 当文本从右到左时确定 JTextArea 的区域中存在什么文本

java - 为什么我的 Java LinkedHashSet 不删除它包含的对象?

Java 同步引用

java - jit 会优化新对象吗

c++ - VS2008 C++ Release模式比 Debug模式慢

optimization - 编译器优化会引入错误吗?

java - Java的TreeSet和TreeMap用的是什么树?

c++ - C++ 类中冗余测试函数的影响

haskell - CHSC 的代码或可执行文件在哪里?

java - 应用“按名称排序”时顺序错误