问题出现的情景:
我们在写代码的时候很自然的会用到一些常量,习惯性的我们会定义在某一个类文件类,然后在其他的使用的地方引用这个类中的变量。
然后有一天,由于某些问题导致不得不修改某个已经定义好的常量的的值,这时候我们可能对服务器做增量方式的更新,那我们可能就值更新这常量问题,而其它相关使用这个常量的文件并没有更新,然而。。。。。,奇葩的问题就出现了。
情景案例
class A{
public static final String VERSION="1.0.0";
}
class B{
public static void main(){
System.out.println(A.VERSION);
}
}
然后某天
我们修改了A
class A{
public static final String VERSION="1.0.1";
}
然鹅我们在服务器上只更新了A文件,并没有更新B文件,这是你会发现打印出来的还是1.0.0,并不是1.0.1
为什么会出现这个奇葩现象呢?
为了跟踪这个问题,我们使用java反编译工具发现,原来B反编译后的代码为:
class B{
public static void main(){
System.out.println("1.0.0");
}
}
终于根源问题找到了
虽然问题找到了根源,但是为什么会出现这个情况呢?
我们定义常量的目的是为了更好的维护,但是在java编译过程中,由于对代码进行优化出现,自动的将相关常量信息编译自动连接编译到结果里,而不是引用类中的数据。那按这个方式理解,我们修改常某个常量就需要对所有涉及到的文件进行更新,这也就势必要求运维在更新时只能选择全量更新,而不能只更新某一个类文件。
那我的疑问就来了,那是不是我们编译后,这个常量文件是否还有存在的意义呢?