ときに列挙型の変数内の関数を計算していますか?

ヤシンBadache:

次のコードを考えてみます。

public enum MyOwnEnum    {

    JANVIER("janvier", "3101"),
    FEVRIER("février", new DateCalculator().getLeapYear()),
    MARS("mars", "3103"),
    AVRIL("avril", "3004");

    // Two variables, the protected constructor, getters

}

コードはどのように振る舞うでしょうか?うは、この方法は、コンパイル時に直接計算と固定、またはそれは、誰かがコールするたびに計算されることFEVRIERを通じてMyOwnEnum.FEVRIERまたはMyOwnEnum.valueOf("FEVRIER")あるいは、しかし、実行時に、固定?

ロビーCornelissen:

enum定数は、クラスローディング時に、より具体的に、実行時に、一度作成した、またはされています。

次のコードを考えてみます。

public enum TestEnum {
    ONE("One at " + System.nanoTime()),
    TWO("Two at " + System.nanoTime());

    String value;

    TestEnum(String value) {
        System.out.println(value);
        this.value = value;
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println("Loading");

        Class.forName("TestEnum"); // Load class

        System.out.println("Evaluating");

        System.out.println(TestEnum.ONE.value); // Evaluate value one
        System.out.println(TestEnum.TWO.value); // Evaluate value two
    }
}

これは、次のような出力を生成します。

Loading
One at 31207575500045
Two at 31207575625697
Evaluating
One at 31207575500045
Two at 31207575625697

値は、後続の呼び出しで変更しないことに注意してください。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331418&siteId=1