if块有静态变量

时间:2017-08-27 15:00:18

标签: java android

我使用objective-c和java。在前者中,我可以访问预处理指令,因此我可以定义用于调试的打印语句,在未定义时不使用循环。

由于Java没有能力,我很好奇编译器如何处理这样的事情:

public class MyClass {
    private static final boolean DEBUG = false;
    public void printMessage(String message) {
        if (DEBUG) {
            //sysout
        } 
    } 
}

每次调用printMessage都会降低性能,还是编译器会认识到DEBUG始终为false并且会补偿每次调用? 有没有更好的方法来处理这个我不知道的事情?

1 个答案:

答案 0 :(得分:0)

编译器会自动优化这些块。即,它们不会留在已编译的代码中。

请考虑以下代码:

public class Test {

    private static final boolean DEBUG = false;

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        for (int i = 0; i < 2000000000; i++) {
            log("hello world");
        }
        System.out.println("Elapsed time: " + (System.currentTimeMillis() - time));
    }

    private static void log(String message) {
        if (DEBUG) {
            System.out.println(message);
        }
    }

}

如果您运行上述代码,它将以 0毫秒运行。

如果打开已编译的类文件(我从IntelliJ IDEA打开它),您可以看到方法log为空,如下所示:

private static void log(String message) {
}

但另一方面,如果您使变量DEBUG 不是最终log函数的主体将保留在已编译的代码中。运行代码需要 15 ms