それは時々します - それは変数が実際に定数であるかどうかによって異なります。
- それは、文字列またはプリミティブ変数のいずれかである必要があります(おそらく他のクラスをとnull値;チェックする必要があります)
- 初期化式は定数式でなければなりません
この場合、変数への参照は効果的に値に変換されます。だから、このコードで:
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
を初期化する必要はありません。メソッドが実行されるとき。
これを防ぐには、変数イニシャライザで定数式で初期化しないようにするだけです。たとえば、次のFoo.BAR
は限りコンパイラが懸念している定数としてカウントされませせるのに十分だろう
class Foo {
public static final int BAR;
static {
BAR = 5;
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
。