在同一块中调用方法两次。为什么?

Lag*_*fer 2 java optimization jvm compiler-optimization

我正在阅读一篇博客文章并试图了解发生了什么。 这是博文。

它有这个代码:

if (validation().hasErrors()) 
      throw new IllegalArgumentException(validation().errorMessage());
Run Code Online (Sandbox Code Playgroud)

在validation()方法中,我们有一些对象初始化和计算,所以假设这是一个昂贵的调用。难道要执行两次吗?或者编译器会优化成这样吗?

var validation = validation();
if (validation.hasErrors()) 
    throw new IllegalArgumentException(validation.errorMessage());
Run Code Online (Sandbox Code Playgroud)

谢谢!

bon*_*ill 7

验证方法将被调用两次,并且每次都会执行相同的工作。首先,该方法比较大,因此不会被内联。如果没有内联,编译器不知道它做了什么。因此,它可以安全地假设该方法有副作用,因此它无法优化第二次调用。

即使该方法是内联的,并且编译器可以检查它,它也会发现实际上存在副作用。每次调用 LocalDate.now() 都会返回不同的结果。因此,您链接到的代码有缺陷,尽管在实践中不太可能遇到问题。

将验证结果捕获到局部变量中更安全,不是出于性能原因,而是出于稳定性原因。想象一下奇怪的情况,初始验证调用失败,但第二次调用通过。然后你会抛出一个没有消息的异常。