java - 什么时候计算枚举变量中的函数?

标签 java enums compilation runtime

考虑以下代码:

public enum MyOwnEnum    {

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

    // Two variables, the protected constructor, getters

}

代码的行为如何?该方法是在编译时直接计算并固定,还是每次有人通过 MyOwnEnum.FEVRIERMyOwnEnum.valueOf("FEVRIER “)?还是固定的,但在运行时?

最佳答案

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

考虑以下代码:

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

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

关于java - 什么时候计算枚举变量中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58483092/

相关文章:

java - 在Android中的TouchImageView中水平和垂直滚动ImageView?

java - Java 中的日期总是 1 小时后?

wxwidgets - 在 Snow Leopard 上编译 wxWidget

c++ - 这段代码中 decltype 的用途是什么?

compilation - 使用 uCLibc 编译 valgrind

java - 速度测试应用程序 下载 上传 Ping

java - Spring MVC : @Value annotation to get int value defined in *. 属性文件

enums - 两种类型的派送应该怎么做?

java - 获取枚举类型的所有实例的列表并在 View 中迭代

java - 在Java中使用枚举制作评分表,然后允许用户输入数字成绩以输出字母成绩