Както е обсъдено тук, javac и други компилатори на Java може да предоставят възможности за елиминиране на код за if
-операции, където условието е "Постоянен израз".
Как се отразява това, ако кодът ми използва постоянен израз, който зависи от други постоянни изрази, дефинирани в различни пакети?
Например, да кажем, че имам следните класове в съответните посочени пакети:
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