Java:消除死代码

我想知道Java如何处理以下情况:

假设我有一个名为Debug的类,它看起来像这样:

public class Debug 

{

private static final boolean isAssertEnabled = true;

public static void assertTrue(boolean b, String errorMessage) {

if (isAssertEnabled) {

if (!b) {

throw new RuntimeException(errorMessage);

}

}

}

}

并假设我的代码有一个看起来像这样的调用:

...

Debug.assertTrue((x + y != z) && (v - u > w), "Some error message");

....

我有几个问题:

  1. 如果 标志设置为 ,是否将整个对Debug.assertTrue的调用编译出来?请注意,仅在调用函数后才检查isAssertEnabled == true。
  2. 如果整个调用确实被编译出来了,是否也意味着布尔表达式的求值被编译出来了?毫无价值地评估该表达将是浪费。

感谢您的帮助!

回答:

布尔表达式的求值 不应 编译掉-至少由javac编译。

即使 当前Debug该类文件不使用该值,在执行时还是会这样吗? __

在使Debug类编译(通过使isAssertEnabled静态)后,javac仍然包含代码-

但我希望JIT编译器将其删除(尽管您应该看到Peter引用的问题)。我不确定是否可以将该方法内联为零。同样,如果JIT编译器可以做到这一点,并且 如果

意识到对参数进行评估不会有任何副作用,则它有可能避免评估。不过,我不会亲自编写代码。

以上是 Java:消除死代码 的全部内容, 来源链接: utcz.com/qa/412550.html

回到顶部