Как обсуждалось здесь , javac и другие компиляторы Java могут предоставлять возможности устранения кода для if
-statements, где условие "Constant Expression" .
Как это влияет, если мой код использует константное выражение, которое зависит от других константных выражений, определенных в разных пакетах?
Например, допустим, что у меня есть следующие классы в соответствующих указанных пакетах:
package foo;
public class Foo {
public static final boolean CONDITION = false;
}
и
package bar;
import foo.Foo;
public class Bar {
public void test() {
if (Foo.CONDITION) {
System.out.println("This line of code could be eliminated.");
} else {
System.out.println("This line of code will be executed.");
}
}
}
Очевидно, что если foo
-пакет загружается во время выполнения из внешнего jar файла, компилятор не может технически просто предположить, что Foo.CONDITION
будет ложным и не должен исключать true
-branch состояния if
.
Принимая во внимание, что если foo
и Bar
были фактически в одном пакете, true
-branch определенно должен быть удален (если компилятор вообще поддерживает исключение кода).
Не совсем уверен, как лучше всего формулировать этот вопрос, но: Как "закрыть" foo
должно быть Bar
для постоянного выражения в foo
также считаться постоянным в Bar
? Должны ли они быть в одном файле? тот же пакет? тот же jar файл? или это вообще не имеет значения (т.е. будет ли компилятор всегда рассматривать Foo.CONDITION
как константу и использовать значение, найденное в пути сборки во время компиляции)?