当它为null时,哪种设置方式更快?

Bar*_*lom 2 java optimization performance

哪个在Java中更快,为什么?

try {
  object.doSomething()
} catch (NullPointerException e) {
  if (object == null) {
    object = new .....;
    object.doSomething();
  } else throw e;
}
Run Code Online (Sandbox Code Playgroud)

要么

if (object == null) {
  object = new .....;
}
object.doSomething();
Run Code Online (Sandbox Code Playgroud)

为什么?

代码将经常被调用,并且object只是null第一次被调用,所以不要考虑抛出的成本NPE(它只发生一次).

PS我知道第二个更好,因为简单,可读性等,我肯定会在真实的软件中使用它.我知道所有关于过早优化的邪恶,不需要提及它.我只是对这些小细节感到好奇.

Pau*_*ald 9

你应该绝对使用后一种方式,不是因为它更快,而是因为它更惯用.异常应该不会被用于在Java程序中的控制流.

这纯粹是轶事,但我曾经做过的所有微基准测试表明,使用控制流的异常将不会像条件一样高效,尽管它可能无法作为泛化支持这一点,而且JVM非常善于优化事物无论如何这样,YMMV.