类从被加载到JVM内存开始,到卸载出内存,整个周期包括:加载、验证、准备、解析、初始化、使用和卸载。而虚拟机规范严格规定了有且只有五种情况必须对类进行初始化(link),这几种情况被称为对类的主动引用,其他的情况被称为被动引用(link),其中就包括调用一个类的常量,不会触发定义常量的类的初始化,这是因为常量(字符串类型或基本数据类型)在编译阶段会存入调用类的常量池中。
问题描述如下:
更新一个常量类class到服务器之后,其他引用这个常量的地方并没有做出改动,导致问题的出现。
对常量问题的思考:
一般在系统运行事情不会发生变化的东西才可以定义为常量,常量可以硬编码写到代码里面。
对于可能做出调整的常量需要考虑:为了方便编译,不用全局编译一次,哪里用到的常量就定义在哪个类中,或者使用枚举类型替换。
参考代码:
可以发现,数组常量会从所在的类加载元素,而字符串和整型的常量会直接在常量池中保存一份数据,不会除非常量所在类的初始化。