Как мне доказать программно, если строка была инициализирована? - PullRequest
0 голосов
/ 27 января 2012

Хотя уровень ведения журнала установлен на INFO, и что во время выполнения условие никогда не будет выполнено, как я могу доказать программно, если "Hi" не будет инициализирован?

if(log.isDebug()){
    log.debug("Hi");
}

То, что я имею в виду, так как уровень ведения журнала - INFO, у регистратора не будет возможности напечатать сообщение «Привет», меня интересует, как я могу узнать, будет ли JRE или JDK принимать / не принимать шаг, чтобы подготовить "Привет" даже через условие не выполняется.

Ответы [ 4 ]

4 голосов
/ 27 января 2012

Дамп байт-кодов.Для константы String будет код операции "ldc".Первый раз, когда код операции выполняется, когда будет создана фактическая строка.Затем строка будет кэшироваться в пуле констант для повторного использования при последующих вызовах / итерациях.Если «ldc» никогда не выполняется, строка не создается.

3 голосов
/ 27 января 2012

Литеральная строка «Привет» является частью определения класса. Если компилятор не может определить, что тело if является мертвым кодом и литерал не нужен, тогда, когда загрузчик классов загружает класс, он загрузит литеральное значение. Поскольку это константа времени компиляции, она также будет автоматически интернирована.

Компилятор не может знать, как поведет себя log.isDebug() при загрузке класса в неизвестную среду выполнения. Насколько ему известно, определение класса регистратора может быть изменено так, что isDebug() возвращает true независимо от значения, установленного для уровня ведения журнала.

0 голосов
/ 27 января 2012

Мне кажется, что строковый литерал "Hi" инициализируется в памяти кучи только для чтения.

. Вы можете сделать такой метод и вычислить дельту памяти:

    if(log.isDebug()){
     log.debug("literal");

     log.debug(memoryUsed());
        log.debug("Hi");
     log.debug(memoryUsed());

     log.debug("initialising");

     log.debug(memoryUsed());
     string x = "Hi"
     log.debug(x);
     log.debug(memoryUsed());
    }


    static long memoryUsed()
      {
      return runtime.totalMemory () - runtime.freeMemory ();
      }
0 голосов
/ 27 января 2012

В этом коде ничего не нужно инициализировать; строковый литерал "Hi" будет помещен компилятором в ваш файл .class, поэтому он будет доступен для использования во время выполнения независимо от того, использовался ли он когда-либо на самом деле.

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