同一代码块中两次调用validation()方法:是否会被编译器优化?
问题解答
这段代码里的validation()方法一定会被执行两次,编译器不会自动帮你优化成只调用一次的形式。
原因很简单:编译器没法确定validation()是不是「纯方法」——也就是每次调用返回的结果完全一致,且没有任何副作用(比如修改外部状态、读写文件等)。如果这个方法内部依赖了可变状态,或者每次调用都会生成新的对象/计算不同结果,两次调用的输出可能不一样,编译器绝对不会冒这个风险去合并调用。
原代码的执行流程是:
- 调用
validation(),判断返回结果的hasErrors()是否为true - 如果条件成立,再次调用
validation(),获取它的errorMessage()来创建异常
因为你提到validation()属于开销较大的调用,这种写法会直接导致双倍的性能损耗,还可能因为两次调用的状态变化出现逻辑问题(比如第一次调用有错误,第二次调用可能因为某些状态变更没错误了,导致异常信息不对)。
正确的做法就是像你给出的优化写法那样,手动把validation()的结果缓存到变量里,只调用一次:
var validation = validation(); if (validation.hasErrors()) throw new IllegalArgumentException(validation.errorMessage());
内容的提问来源于stack exchange,提问作者LagSurfer
相关产品推荐
相关产品推荐

