首页 > 解决方案 > 什么时候计算枚举变量中的函数?

问题描述

考虑以下代码:

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.FEVRIERor调用时计算MyOwnEnum.valueOf("FEVRIER")?或固定,但在运行时?

标签: javaenumscompilationruntime

解决方案


枚举常量在运行时创建一次,或者更具体地说,在类加载时创建。

考虑以下代码:

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

请注意,这些值不会在后续调用中更改。


推荐阅读