質問

私はなく、Javaコードです。このシナリオ:2授業- ClassAClassB.

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)メソッドを呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top