java - 什么时候计算枚举变量中的函数?
问题描述
考虑以下代码:
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
or调用时计算MyOwnEnum.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
请注意,这些值不会在后续调用中更改。
推荐阅读
- firebase - Firebase 短网址不重定向
- python - 如何更改绘图轴的基础?(Python,Matplotlib)
- python - 在我抓到一个鸡蛋之后,一切都停止了
- python - 如何根据 Pandas 中的另一个 DataFrame 更改 DataFrame 某列中的值
- angular - 为什么 DragDrop 在材质对话框中不起作用?
- python - 如何让我的代码更快地找到最小值?
- mysql - 在写入数据库之前等待
- r - 在R中的一个图上覆盖两个直方图上的两个正态分布
- javascript - TypeError: 测试 Svelte 组件时组件不是构造函数
- express - 使用参数的axios路由请求返回404