Препроцессор Java - PullRequest
       16

Препроцессор Java

43 голосов
/ 28 августа 2009

Если у меня есть логическое поле, например:

private static final boolean DEBUG = false;

и в моем коде есть такие выражения:

if(DEBUG) System.err.println("err1");

препроцессор Java просто избавляется от оператора if и недоступного кода?

Ответы [ 2 ]

113 голосов
/ 28 августа 2009

Большинство компиляторов исключают это утверждение. Например:

public class Test {

    private static final boolean DEBUG = false;

    public static void main(String... args) {
        if (DEBUG) {
            System.out.println("Here I am");
        }
    }

}

После компиляции этого класса я распечатываю список произведенных инструкций командой javap:

javap -c Test
    Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."":()V
       4:   return

    public static void main(java.lang.String[]);
      Code:
       0:   return

    }

Как видите, нет System.out.println! :)

13 голосов
/ 28 августа 2009

Да, компилятор Java исключит скомпилированный код из блоков if, которые контролируются константами. Это приемлемый способ условно скомпилировать «отладочный» код, который вы не хотите включать в производственную сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...