所有评估都是从左到右进行的吗?

Gen*_* S. 0 java

String foo = null;

if(foo == null || foo.equals("")){
    //this is only safe if I'm guaranteed that the evaluation happens from left to right
}
Run Code Online (Sandbox Code Playgroud)

在Java中,有这样的保证吗?或者我需要同时执行这些测试以确定吗?

Jon*_*eet 5

是.从JLS第15.24节:

条件运算||符或运算符运算符类似于|(第15.22.2节),但仅在其左侧操作数的值为false时才计算其右侧操作数.

除非左侧操作数为真,否则甚至不会评估右侧操作数的事实意味着它必须从左到右进行评估......但事实上,所有操作员都是如此.来自JLS 15.7:

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.

方法(和构造函数)参数也是如此.例如,从第15.12.4.2节(评估参数,方法调用的运行时评估的一部分):

参数表达式(如果有)按从左到右的顺序进行计算.如果任何参数表达式的求值突然完成,则其右侧的任何参数表达式的任何部分都不会被评估,并且由于相同的原因,方法调用突然完成.

(有趣的是注意到"似乎"在这里 - JVM实际上无序地评估它们是可以的,只要这不可观察......)