假设条件检查包含用于获取值的方法调用。如果满足条件,则使用该方法返回的值进行值更新。这里是一个简化的例子。

// x and maxValue are e.g. both int, methodCall(x) returns int
if (methodCall(x) > maxValue) maxValue = methodCall(x);


如果满足条件,JVM会调用methodCall 2次吗?有没有一种方法可以避免这种性能损失(无需将methodCall(x)分配给牺牲内存和计算时间的局部变量),并直接将条件检查的结果重新用于分配?

哈根

最佳答案

是的,该方法被调用了两次。如果只想调用一次,则需要将结果保存在if之前的变量中。

int value = methodCall(x);
if (value > maxValue) maxValue = value;


请注意,该值保存在本地变量(而不是字段)中。

编辑:对此用例(如bcsb1001在评论中指出的)的一种更优雅的解决方案是使用Math#max

maxValue = Math.max(methodCall(x), maxValue);

10-02 05:09