作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Java 中,在初始化枚举元素之前不可能进行静态初始化,因为枚举元素始终必须首先声明和初始化。
如果静态初始化不依赖于枚举元素,则其在元素之后的执行顺序不是问题。否则,如果初始化依赖于枚举元素,这会引起麻烦。然而,Java 枚举提供了values() 方法,能够满足这种依赖性。但调用values()可能会产生开销,因为values()方法每次都会复制内部静态数组。
例如(在帖子 Why can't enum's constructor access static fields? 中编辑):
public enum Day {
SUNDAY("Sun"), MONDAY("Mon"), TUESDAY("Tue"), WEDNESDAY("Wed"), THURSDAY("Thu"), FRIDAY("Fri"), SATURDAY("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
static
{
for(Day day:values())
ABBREV_MAP.put(day.abbreviation, day);
}
private Day(String abbreviation) {
this.abbreviation = abbreviation;
//ABBREV_MAP.put(abbreviation, this); this is not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
如示例中所示,如果我能够在枚举元素之前初始化 HashMap,则我不需要静态初始化代码块,因此调用 value() 方法来进行复制。在构造函数中注释掉的代码就足够了。
我的问题是,由于首先初始化枚举元素的义务可能会带来不必要的开销,是否有可能消除这种开销,或者换句话说,是否可以在枚举元素之前进行静态初始化?如果不是,只是为了代码可读性吗?我认为首先声明枚举元素与某些答案中提到的安全初始化无关。
在这个问题中,我提到了一个开销,尽管大多数时候它很小,但至少对于深入理解和集思广益来说是值得的。
最佳答案
作为心理 Yaga (思考编译器必须做什么):
public enum Day {
SUNDAY(A.Sun), MONDAY(A.Mon), TUESDAY(A.Tue),
WEDNESDAY(A.Wed), THURSDAY(A.Thu), FRIDAY(A.Fri), SATURDAY(A.Sat);
private enum A {
Sun(Day.SUNDAY), Mon(Day.MONDAY), Tue(Day.TUESDAY), Wed(Day.WEDNESDAY),
Thu(Day.THURSDAY), Fri(Day.FRIDAY), Sat(Day.SATURDAY);
private final Day day;
A(Day day) {
this.day = day;
}
}
private final A abbrev;
Day(A abbrev) {
this.abbrev = abbrev;
}
public static Day getByAbbreviation(String abbreviation) {
return A.valueOf(abbreviation).day;
}
}
太反常了。
关于java - 枚举元素之前的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43939293/
我是一名优秀的程序员,十分优秀!