final static Map 与static 代码块加载的顺序
1. 代码
public class StructureMapConstants {
/**
* 静态的Map,用于存储任务名与任务编号的映射关系
**/
public static final Map<String, Integer> TASK_NAME_TO_CODE_MAP;
static {
TASK_NAME_TO_CODE_MAP = new HashMap<>();
TASK_NAME_TO_CODE_MAP.put("任务a", 1);
TASK_NAME_TO_CODE_MAP.put("数据b", 2);
TASK_NAME_TO_CODE_MAP.put("图c", 3);
TASK_NAME_TO_CODE_MAP.put("结束", 4);
}
public static Integer getCodeByTaskName(String taskName) {
return TASK_NAME_TO_CODE_MAP.getOrDefault(taskName, 0);
}
}
在 StructureMapConstants
类中,getCodeByTaskName
方法的调用顺序依赖于 Java 类的初始化流程。具体来说,类的初始化顺序如下:
1. 类的初始化流程
1.1 类加载(Loading)
StructureMapConstants
类被加载到 JVM 中。
1.2 链接(Linking)
- 验证(Verification):检查类的字节码是否合法。
- 准备(Preparation):为
TASK_NAME_TO_CODE_MAP
分配存储空间,并初始化为null
(因为它是final
,但没有直接赋值)。 - 解析(Resolution):解析符号引用(例如
HashMap
类)。
1.3 初始化(Initialization)
- 静态变量初始化(按照代码顺序执行)
TASK_NAME_TO_CODE_MAP
被赋值为new HashMap<>()
。
- 执行静态代码块(static 代码块)
- 依次执行
TASK_NAME_TO_CODE_MAP.put(...)
语句,填充TASK_NAME_TO_CODE_MAP
。
- 依次执行
2. 当 getCodeByTaskName
被调用时
StructureMapConstants
的static
变量已经初始化完成。- 由于
TASK_NAME_TO_CODE_MAP
是final
且已经初始化,它不会被重新赋值。 getCodeByTaskName
方法只是一个普通的static
方法,直接从TASK_NAME_TO_CODE_MAP
中获取值。
3. 执行顺序总结
StructureMapConstants
类加载TASK_NAME_TO_CODE_MAP
变量分配空间TASK_NAME_TO_CODE_MAP
被初始化(new HashMap<>()
)static
代码块执行,填充TASK_NAME_TO_CODE_MAP
StructureMapConstants
类初始化完成getCodeByTaskName
方法被调用,查询TASK_NAME_TO_CODE_MAP
4. 结论
所以,当 StructureMapConstants.getCodeByTaskName("任务创建")
被调用时,TASK_NAME_TO_CODE_MAP
已经初始化完毕,返回 1
。