定数を更新したら、classを再コンパイルしてください.

1535 ワード

一部の友人は、プログラムで使用されるさまざまな定数を1つのクラスで統一的に管理するのが好きかもしれません.

public class AppConst {
    public static final String STR_CONST_1 = "String1";
    public static final String STR_CONST_2 = "String2";
    ......
}

これらの定数は、いくつかの論理コードセグメントで使用されます.これにより、定数の管理が容易になり、大量のmagic number/textが回避され、定数の内容を変更する際にこのクラスを変更するだけでよいが、パッケージを再コンパイルするプログラムは依然としてマイペースであり、定数の変更に即時に反応していないことが不思議になることがある.これは何解だろうか.
以前の「JVM学習ノート3--クラスの初期化」で述べたように、静的定数(すなわちstatic finalで修飾された変数)はコンパイル時定数であり、1つのclassファイルのコンパイルが完了すると、内部で使用されるすべての定数の具体的な値が確定し、実行時に定数管理クラスに接続した後に参照で定数を使用するとは考えられない.たとえば、次のコードがあります.

import AppConst;
public class SomeService {
    public void serviceJob1() {
        System.out.println(AppConst.STR_CONST_1);
    }
}

クラスSomeServiceはSTRを使用していますCONST_1という定数は、表面的にはAppConstクラスによって取得されたこの値であり、実際にはSomeServiceがコンパイルされた後、そのコードは実際には

public class SomeService {
    public void serviceJob1() {
        System.out.println("String1");
    }
}

この中にはAppConstは何もありませんので、AppConstに関する定数を修正してもSTR_CONST_1="NotString 1"、SomeServiceは"String 1"を印刷する可能性があります.SomeServiceのコードは変更されていないため、インクリメンタルコンパイルの場合、classファイルは再コンパイルされません.
上のことが分かったら、大体どうすればいいか分かります.私の方法は2つあります.
1.元の条件でclassファイルを削除した後、手動で再コンパイルします.
2.IDEを使用する場合は、まずSomeServiceを細かく修正して保存し(自動コンパイルされます)、その後修正して保存します(再自動コンパイル).これでclassファイルが更新されます.