小编典典

Java:消除死代码

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

感谢您的帮助!


阅读 476

收藏
2020-11-23

共1个答案

小编典典

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

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

在使Debug类编译(通过使isAssertEnabled静态)后,javac仍然包含代码-
但我希望JIT编译器将其删除(尽管您应该看到Peter引用的问题)。我不确定是否可以将该方法内联为零。同样,如果JIT编译器可以做到这一点,并且 如果
意识到对参数进行评估不会有任何副作用,则它有可能避免评估。不过,我不会亲自编写代码。

2020-11-23