クラス名で最終的な静的変数にアクセスしているときに、Javaで静的ブロックが処理されないのはなぜですか?
class Foo {
public static final int BAR;
static {
System.out.println("Hello");
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
クラス名で最終的な静的変数にアクセスしているときに、Javaで静的ブロックが処理されないのはなぜですか?
class Foo {
public static final int BAR;
static {
System.out.println("Hello");
}
}
class Baz {
public static void quux() {
System.out.println(Foo.BAR);
}
}
場合によっては、変数が実際に定数であるかどうかによって異なります。
その場合、変数への参照は効果的に値に変換されます。したがって、このコードでは:
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
コンパイラに関する限り、それは定数としてカウントされないようにするのに十分です。