Java:消除死代码

ykr*_*sik 10 java compilation dead-code

我想知道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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我有几个问题:

  1. 如果isAssertEnabled标志设置为false,那么整个对Debug.assertTrue的调用是否会被编译出来?请注意,检查isAssertEnabled == true是否仅在函数调用后在函数内部进行.
  2. 如果整个调用都被编译出来,那是否也意味着编译出布尔表达式的评估?如果没有任何评价表达将是一种浪费.

谢谢你的帮助!

Jon*_*eet 6

应该编译布尔表达式的评估- 至少是由javac编译.

即使Debug类文件当前对值没有任何作用,谁会说在执行时会出现这种情况?

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