gpt4 book ai didi

java - 枚举元素之前的静态初始化

转载 作者:行者123 更新时间:2023-12-02 02:50:25 27 4
gpt4 key购买 nike

在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com