Java: устранение мертвого кода - PullRequest
10 голосов
/ 21 января 2011

Я хотел бы знать, как 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);
            }
        }
    }
}

и предположим, что мой код имеетвызов, который выглядит примерно так:

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

У меня есть несколько вопросов:

  1. Если флаг isAssertEnabled установлен на false , будет ли скомпилирован весь вызов Debug.assertTrue?Обратите внимание, что проверка isAssertEnabled == true выполняется только внутри функции после ее вызова.
  2. Если весь вызов компилируется, значит ли это, что вычисляется логическое выражение?Было бы пустой тратой оценить это выражение даром.

Спасибо за помощь!

Ответы [ 3 ]

6 голосов
/ 21 января 2011

Оценка логического выражения не должна компилироваться - по крайней мере, с помощью javac.

Даже если файл класса Debug в настоящее время ничего не делает со значением, кто скажет, что так будет во время выполнения?

После компиляции класса Debug (статической isAssertEnabled) javac по-прежнему включает код - но я ожидаю, что JIT-компилятор удалит его (хотя вы должны увидеть вопрос , на который ссылается Питер ) , Могу ли я потом встроить метод в ничто, я не уверен. Опять же, если JIT-компилятор может это сделать, и , если осознает, что оценка аргументов не может иметь побочных эффектов, он может потенциально избежать оценки. Хотя я бы не стал писать код в зависимости от этого.

2 голосов
/ 21 января 2011

Почему вы пытаетесь создать то, что Java уже предоставляет изначально?

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

1 голос
/ 21 января 2011

Это напоминает мне "isTraceEnabled ()", "isDebugEnabled ()" и так далее в Log4jЧтобы избежать ненужных вычислений операторов журналов, необходимо явно записать свои операторы журнала в if-операторах.

...