java编译器会对此进行优化:
boolean foo1 = getSomeHardToGetBoolean();
boolean foo2 = getSomeEasyToGetBoolean();
if(foo1 && foo2){
//do stuff
}
对此:
if(getSomeEasyToGetBoolean() && getSomeHardToGetBoolean()){
//do stuff
}
甚至这个:
if(getSomeHardToGetBoolean() && getSomeEasyToGetBoolean()){
//do stuff
}
我使用第一种方式作为可读性的一般做法,但代价是什么?
旁注:假设是Java 8。使用JIT。直到运行时才能确定布尔值。布尔语完全相互独立。我可能不会停止使用第一种方式,但我只是好奇。谢谢!的
答案 0 :(得分:2)
考虑到getSomeEasyToGetBoolean()
和getSomeHardToGetBoolean()
可能有副作用,所有三个代码段都有不同的功能,如果编译器将它们混合起来就会出错
答案 1 :(得分:2)
优化器必须维护程序的语义。因此,如果getSomeEasyToGetBoolean()
和getSomeHardToGetBoolean()
具有可观察到的副作用,则优化程序无法忽略这些副作用,因为这会改变程序的语义。
但是如果这些操作没有可观察到的副作用,优化器确实会执行这样的转换,例如内联,重新排序和将条件移动到代码块的开头属于优化器的标准库。
这就是多线程程序在没有适当的同步构造的情况下访问公共数据结构的原因可能会破坏,因为在这种情况下,线程可能会观察到执行优化代码的线程的更改行为。
答案 2 :(得分:1)
简而言之,没有。
编译器以这种方式优化是没有意义的,考虑到if
语句可能嵌套在循环中,并且布尔值可能在运行时发生变化(编译后,即使是JIT)