如果我在编译时知道两个常量,Java编译器将折叠它们.
final static int foo = 2; final static int bar = 17; int myVariable; int myFunction(){ return foo*bar + myVariable; }
在运行时,myFunction将返回34 + myVariable,并且不需要计算2*17,因为它是在编译时完成的.
我的问题是:如果直到运行时才知道常量,它会不会这样做?我相信这称为运行时代码专业化.
final int foo; final int bar; int myVariable; int myFunction(){ return foo*bar + myVariable; }
如果foo和bar在对象的构造函数中初始化为2和17,myFunction是否会专门返回34 + myVariable,或者每次调用函数时它仍会计算foo*bar,即使foo*bar永远不会改变?
*编辑:我指的是最新版本的JVM,1.7.0_45.
Foo和Bar 在这种情况下永远不会改变它们在不同的实例中可能会有所不同,但系统不会为每个对象的每个实例单独编译代码.这样做的开销会很糟糕.
系统可能会检测到这种情况,但这种情况不大可能,您当然不能指望所有甚至大多数环境都这样做.foobar = foo*bar
如果您认为乘法会对性能产生重大影响,那么您最好的选择就是存储自己并使用它.(这不太可能).