关于常量
项目代码中经常会需要定义一些常量字符串。比如一些默认取值。
定义常量字符串的方法,首先想到的就是定义一个类属性,如:
public static final String CONST = "1";
调用的时候,当然就是:
String cont1 = ConstantTest.CONST;
但是这种方法有个问题。万一哪一天,常量的取值变化了,比如上文中的CONST取值变成了"2",那么常量的定义就要变成:
public static final String CONST = "2";
但是仅仅这样就够了么?不够。如果不对引用到这个常量的类进行重新编译,那么,下面的语句输出的仍然是"1":
String cont1 = ConstantTest.CONST;
System.out.println(cont1);
这是因为:java在编译String cont1 = ConstantTest.CONST;
这个语句时,得到的结果实际是String cont1 = "1";
如果仅仅修改public static final String CONST = "2";
而不对String cont1 = ConstantTest.CONST;
所在类重新编译,那么后者的.class文件中仍然是String cont1 = "1";
而不是修改后所期望的String cont1 = "2"
;
这是我在项目中遇到的一个问题:一个看似不会变化,实际也一年多没有变过的值居然变了。然后所有引用了这个常量字符串的类都要重新编译、并更新对应的class文件。很受伤。
替代方案可以是用枚举类来定义常量,或者是把常量放到.properties文件中去。都可行。
2023-02-15 补充
这是JVM的内联机制导致的问题。