Java编译器将原始或static final
类型的String
变量(在定义时赋值)视为 REAL 编译时常量?
这样的变量是否会获得编译常量在其他语言中的性能加值,比如C ++?
原始或String
值的枚举是否被编译器视为常量?
根据我的理解,当它不影响脚本的工作时,用常量替换变量总是好的,所以我想知道const
关键字的空意义在java。
提前谢谢。
答案 0 :(得分:4)
是的,它们是编译时常量。例如,代码
private static final boolean DEBUG = false;
...
if (DEBUG) {
// some code
}
将被编译为字节码,甚至不包含if
内的代码。它将被编译器删除。
如果您决定更改其值,则必须重新编译引用该常量的所有类。
但请注意,它只是无法修改的引用。可以更改对象的内容(如果它是可变的)。例如,可以修改以下代码中的数组或StringBuilder的内容:
// don't do this:
public static final String[] seasons = new String[] {"Spring", "Summer", "Autumn", "Winter"};
public static final StringBuilder someBuffer = new StringBuilder("foo");
关于枚举的问题没有意义。没有原始或STring的枚举。每个枚举都定义了自己的类。
答案 1 :(得分:1)
Java编译器的优化程度不高,但它确实对最终基元进行了常量表达式求值,并对字符串和枚举进行了一些常见的优化。这是否是好事是相当主观的。例如假设你在库中有一个常量
public static final int MY_CONST = 1;
这将被内联。但是,如果您尝试使用反射在代码或运行时更改此项,则除非您重新编译依赖于它的所有内容,否则这将无效。鉴于大多数Java具有动态后期链接,这很容易被遗忘并在某种程度上打破了动态链接。
恕我直言,如果他们今天再次设计编译器,他们就不会进行这种优化,他们会让JIT这样做。
答案 2 :(得分:0)
java中没有使用 const 关键字。在创建语言时,它被保留为保留关键字,但未实现。
枚举和预定义的字符串值如下:
String foo = "foo";
被认为是编译时常量,它们被赋值并且是不可变的。
您可以在Java语言规范中阅读有关编译时常量的更多信息:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313