public static final変数に輸入されるjavaクラス
質問
私はなく、Javaコードです。このシナリオ:2授業- ClassA
や ClassB
.
ClassA
ものを除き4では、public static final string値ることを確認できます。その目的には利用価値のように ClassA.variable
(というのに、なぜ私がコードとします。
ClassB
輸入 ClassA
.私は編集中の文字列の値 ClassA
-編集します。私 ClassB
私が使ったこの古い値ではありません。あったかを再コンパイル ClassB
での利用から新しい価値 ClassA
!といった再コンパイルその他のクラスの輸入 ClassA
!)
ここでは、JDK1.6以ったものの名前を再コンパイル ClassB
も!啓発しました。:)
解決
の場合の値の final
変数からクラス ClassA
ことが起こるコンパイル時の定数で、コンパイラがinlinedの授業を ClassA
の代わりに発生す実行時の参考値です。と思い、この場合のご説明します。
例:
public class Flags {
public static final int FOO = 1;
public static final int BAR = 2;
}
public class Consumer {
public static void main(String[] args) {
System.out.println(Flags.FOO);
}
}
この例では、コンパイラが取り入れる価値の FOO
のコード生成され Consumer
の代わりに発生と同等の実行時の参考値です。の場合の値の FOO
変更後、再コンパイル Consumer
するためにも使用可能である。
この最適化、複数の利点に関しての効率化、迅速にプログラムの取りまとめを行いました。例えば、inliningの価値がさらなる最適化の表現を使用するので、例えば:
int x = Flags.FOO * 10;
この例では、inliningの値はこちら1)可能にするコンパイラごとの増殖能に差は、省略可能でalltogether.
他のヒント
これは、バイナリ互換性の問題です。定数フィールドへの参照は、コンパイル時に解決されています。あなたが見ている行動は正しいです。あなたは、クラスAの値を変更した場合、あなたは、クライアント(クラスB)を再コンパイルする必要があります。このような問題は、Javaで導入された列挙型を使用して、定数を追加することを検討して回避するために5.0をリリースます。
なぜあなたは個別にクラスをコンパイルしようとしている?
Mavenのか蟻のようなビルドシステムを使用するか、またはちょうどあなたのIDEがそれをやらせます。
行うための唯一の安全な事は行うことができ、すべてのクラスが再コンパイルされるまで変更されたJavaクラスの依存すべてのJavaを再コンパイルすることです。
あなたはスイッチの値を使用していない場合は、代わりにこれを行うことができます:
public class A
{
public static final int FOO;
public static final String BAR;
static
{
FOO = 42;
BAR = "Hello, World!";
}
}
コンパイラは、もはやハードそれらを使用している他のクラスの値をコード化しません。
と仮定にClassAは次のようになります:
public class ClassA {
public static final int FOO = 1;
public static final int BAR = 2;
}
あなたはそれを再コンパイルする場合、ClassBのは、古い値を引き続き使用します。私はそれがコンパイラに依存ことができると思いますが、私は、これは典型的な行動だと思います。あなたは毎回にClassAの変更で定数をClassBのを再コンパイルしたくない場合は、あなたがこのような何かをする必要があります:
public class ClassA {
public static final int FOO = CONST(1);
public static final int BAR = CONST(2);
public static int CONST(int i) { return i; }
}
Becuaseは今、javacは、定数をインライン化に消極的です。 ClassAクラスの静的初期化子は、実行時に代わりに、それはCONST(int)メソッドを呼び出します。