枚举类型为构造函数的枚举类型中的静态块的执行顺序

这来自有效的Java:

// Implementing a fromString method on an enum type

private static final Map<String, Operation> stringToEnum

= new HashMap<String, Operation>();

static { // Initialize map from constant name to enum constant

for (Operation op : values())

stringToEnum.put(op.toString(), op);

}

// Returns Operation for string, or null if string is invalid

public static Operation fromString(String symbol) {

return stringToEnum.get(symbol);

}

请注意,操作常量是从创建常量之后运行的静态块放入stringToEnum映射中的。试图使每个常量从其自己的构造函数中放入映射中将导致编译错误。这是一件好事,因为如果合法,它将导致NullPointerException。除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段。此限制是必需的,因为在构造函数运行时尚未初始化这些静态字段。

我的问题是关于这条线的:

“请注意,将操作常量从创建常量之后运行的静态块放入stringToEnum映射中”。

我认为静态块在构造函数运行之前就已执行。实际上是在类加载期间执行的。

我在这里想念什么?

回答:

我理解您的问题是:为什么可以保证在运行静态块之前会初始化枚举常量。答案在JLS中给出,具体示例在#8.9.2.1中给出,并带有以下说明:

静态初始化从上到下进行。

和枚举常量是隐式最终静态的,并在静态初始值设定项块之前声明。

行为与普通班级没有什么不同。下面的代码打印:

In constructor: PLUS

PLUS == null MINUS == null

In constructor: MINUS

PLUS != null MINUS == null

In static initialiser

PLUS != null MINUS != null

In constructor: after static

PLUS != null MINUS != null

public class Operation {

private final static Operation PLUS = new Operation("PLUS");

private final static Operation MINUS = new Operation("MINUS");

static {

System.out.println("In static initialiser");

System.out.print("PLUS = " + PLUS);

System.out.println("\tMINUS = " + MINUS);

}

public Operation(String s) {

System.out.println("In constructor: " + s);

System.out.print("PLUS = " + PLUS);

System.out.println("\tMINUS = " + MINUS);

}

public static void main(String[] args) {

Operation afterStatic = new Operation ("after static");

}

}

以上是 枚举类型为构造函数的枚举类型中的静态块的执行顺序 的全部内容, 来源链接: utcz.com/qa/419759.html

回到顶部