Это будет иногда - это зависит от того, является ли переменная фактически константа:
- Он должен быть строкой или примитивной переменной (возможно любого другого класса с нулевое значение, я должен был бы проверить)
- выражение инициализации должно быть постоянным выражением
Если это так, любые ссылки на переменную эффективно преобразуются в значение. Так что в этом коде:
class Foo {
public static final int BAR = 5;
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
Метод в Baz
компилируется в тот же код, как:
public static void quux() {
System.out.println(5);
}
Там нет ни намека на Foo.BAR
оставил в байткод, поэтому Foo
не нужно инициализировать когда метод выполняется.
Если вы хотите, чтобы это не происходило, вы всегда просто не инициализируетесь постоянным выражением в переменном инициализаторе. Например:
class Foo {
public static final int BAR;
static {
BAR = 5;
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
Это было бы достаточно, чтобы сделать Foo.BAR
не считается постоянным, насколько компилятор обеспокоен.