Java&编译时常数

时间:2011-12-28 12:04:34

标签: java performance constants

Java编译器将原始或static final类型的String变量(在定义时赋值)视为 REAL 编译时常量?
这样的变量是否会获得编译常量在其他语言中的性能加值,比如C ++?

原始或String值的枚举是否被编译器视为常量?

根据我的理解,当它不影响脚本的工作时,用常量替换变量总是好的,所以我想知道const关键字的空意义在java。
提前谢谢。

3 个答案:

答案 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