Как обсуждалось здесь, javac и другие компиляторы Java могут предоставлять возможности устранения кода для if
-операторов, где условие представляет собой "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
-ветвь оператора if
.
Принимая во внимание, что если бы Foo
и Bar
были на самом деле в одном пакете, то ветвь true
определенно должна быть исключена (если компилятор вообще поддерживает исключение кода).
Не совсем уверен, как лучше сформулировать этот вопрос, но: насколько «близко» должно быть Foo
к Bar
, чтобы постоянное выражение в Foo
также считалось постоянным в Bar
? Должны ли они быть в одном файле? такой же пакет? тот же jar-файл? или это вообще не имеет значения (т. е. будет ли компилятор всегда рассматривать Foo.CONDITION
как константу и использовать значение, найденное в пути сборки, во время компиляции)?
javap -c Bar
. - person arshajii   schedule 23.05.2014