Będzie czasami - to zależy od tego, czy zmienna jest faktycznie stała:
- To musi być łańcuch znaków lub zmienna prymitywny (ewentualnie każda inna klasa z wartość pusta; musiałem sprawdzić)
- Wyrażenie inicjujące musi być stałym wyrażeniem
Jeśli tak jest, wszelkie odniesienia do zmiennej są skutecznie przekształcane w wartość. Więc w ten kod:
class Foo {
public static final int BAR = 5;
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
Sposób Baz
jest kompilowany do tego samego kodu jako:
public static void quux() {
System.out.println(5);
}
nie ma śladu Foo.BAR
lewo w kodu bajtowego, dlatego Foo
nie musi być zainicjowany kiedy metoda zostanie wykonana.
Jeśli chcesz temu zapobiec, zawsze po prostu nie inicjuj go ze stałym wyrażeniem w inicjalizatorze zmiennych. Na przykład:
class Foo {
public static final int BAR;
static {
BAR = 5;
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
To byłoby na tyle, aby nie liczyć Foo.BAR
jako stała ile kompilator jest zaniepokojony.