Java If (false) Компиляция - PullRequest
       4

Java If (false) Компиляция

11 голосов
/ 05 июня 2011

Я занимаюсь разработкой динамического веб-проекта с использованием Tomcat.Полезно иметь глобальный флаг - единственное, что мне нужно менять между серверами разработки и развертывания.Чаще всего этот флаг используется в операторах печати. ​​

public class Debug {
    public final static boolean DEVEL = true;        
    public static void print(String message){
        if(DEVEL){
            System.out.println(message);
        }
    }
}

Мой вопрос заключается в том, будет ли Java составлять операторы печати.т. е. если тег devel имеет значение false, сообщения, очевидно, не будут печататься, но будут включены в файлы классов (devel является окончательным).Это вопрос эффективности.Я слышал, что Java-компилятор очень умен, но подхватит ли он это.

Ответы [ 5 ]

14 голосов
/ 05 июня 2011

используйте атрибут 'final' (как вы это сделали), и он скомпилирует код:

public static final boolean DEVEL = false;

Вы можете проверить, получив в файле результирующего класса строку, которая появилась бы, только если код был скомпилирован.

6 голосов
/ 05 июня 2011

Посмотрите эту статью:

http://www.javaworld.com/javaworld/jw-03-2000/jw-03-javaperf_4.html

Код, который вы представили, называется «мертвым кодом», поэтому он не будет включен в файл скомпилированного класса, если вы установитеDEVEL в false, он не будет включен в байт-код.

Кроме того, проверьте команду

javap -c

, чтобы увидеть результирующий байт-код вашего класса.

1 голос
/ 05 июня 2011

Если вы хотите, чтобы компилятор не компилировал его, используйте это:

    public final static boolean DEVEL = Math.random() > -1;

Компилятор не будет знать, что это всегда true.(конечно, используйте < -1 для false)

Я считаю этот трюк удобным, если вы хотите временно удалить код, не заставляя компилятор жаловаться на мертвый код, например:

void myMethod() {
    // temporarily exit early
    if (Math.random() > -1) return;
    // usual code
}
0 голосов
/ 13 июня 2012

Стоимость может быть выше, если метод сообщения toString () является дорогостоящим. Метод toString большого SQL-запроса в подготовленном операторе вызвал переполнение кучи из-за этой строки. Таким образом, стандарт не удалил его.

0 голосов
/ 05 июня 2011

Я никогда не видел, чтобы компилятор удалял такой код, однако JIT эффективно удалит код, который никогда не запускается.Утверждения являются распространенным случаем использования для этого.Там все еще могут быть условные затраты, но обычно о них не стоит беспокоиться.то есть менее 1 наносекунды.

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