14

これはEffective Javaからのものです

int 列挙型パターンを使用するプログラムは脆弱です。int 列挙型はコンパイル時の定数であるため、それらを使用するクライアントにコンパイルされます。

int enum パターンがコンパイルされた型定数と呼ばれる理由と、クライアントにコンパイルされることの意味を説明できる人はいますか?

このような定数の例を次に示します。

public static final int APPLE_FUJI = 0;
4

2 に答える 2

19

次の 2 つのファイルがあるとします。

Foo.java:
public class Foo
{
    public static final int SOMETHING = 1;
}

Bar.java:
public class Bar
{
    public static void main(String[] args)
    {
        System.out.println(Foo.SOMETHING);
    }
}

両方をコンパイルして実行するjava Barと、1 が出力されます。

ここで Foo.java を 2 になるように変更し、 Foo.javaだけSOMETHINGを再コンパイルします。再実行して1 が出力されます。定数値は、実行時に値を要求するのではなく、それを使用するすべてのコードにコピーされます。java BarFoo

実際には、何かが変更されるたびにすべてを再コンパイルしても問題ありません。

于 2012-08-02T08:13:31.500 に答える
6

.class値「0」自体は、コンパイル中にファイルに組み込まれます。その後、その値を変更すると、アプリケーション/ライブラリを使用するクライアントのコードを含め、それを使用するすべてを再コンパイルする必要があります。

そうしないと、警告は表示されませんが、正しくない動作になります。

コンパイル時の定数がコード内でのみ使用されている場合は、完全なクリーン/ビルド サイクルを前提として、それほど問題にはなりません。あなたのコードがより多くの聴衆に届くようになると、これはより大きな問題になります。

于 2012-08-02T08:12:09.237 に答える