JVM是否进行运行时常量折叠?

Log*_*ins 2 java jvm constantfolding

如果我在编译时知道两个常量,Java编译器将折叠它们.

final static int foo = 2;
final static int bar = 17;
int myVariable;

int myFunction(){
    return foo*bar + myVariable;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,myFunction将返回34 + myVariable,并且不需要计算2*17,因为它是在编译时完成的.

我的问题是:如果直到运行时才知道常量,它会不会这样做?我相信这称为运行时代码专业化.

final int foo;
final int bar;
int myVariable;

int myFunction(){
    return foo*bar + myVariable;
}
Run Code Online (Sandbox Code Playgroud)

如果foo和bar在对象的构造函数中初始化为2和17,myFunction是否会专门返回34 + myVariable,或者每次调用函数时它仍会计算foo*bar,即使foo*bar永远不会改变?

*编辑:我指的是最新版本的JVM,1.7.0_45.

Tim*_*m B 5

Foo和Bar 在这种情况下永远不会改变它们在不同的实例中可能会有所不同,但系统不会为每个对象的每个实例单独编译代码.这样做的开销会很糟糕.

系统可能会检测到这种情况,但这种情况不大可能,您当然不能指望所有甚至大多数环境都这样做.foobar = foo*bar如果您认为乘法会对性能产生重大影响,那么您最好的选择就是存储自己并使用它.(这不太可能).