web 项目里面经常会定义一些常量的接口,类,方便开发引用。在维护工作中,如果修该了这个常量值Constant类,发布过程中只替换Constant类,你会发现引用类中的值根本没有改掉。
例:定义一个常量类Constant 定义了两个基本常量。
public class Constant {
public final static int Max_size = 120;
public final static String xxSQL="select *From SCOTT;";
}
写个调用类:
public class Client {
public static void main(String[] args ){
System.out.println("引用基本类型常量:"+Constant.Max_size);
System.out.println("引用String类型常量:"+Constant.xxSQL); }
}
结果大家都知道:
引用基本类型常量:120
引用String类型常量:select *From SCOTT;
如果你用反编译工具打开Client.class的内容你就会发现,它的内容是这样的:
public class Client
{
public Client()
{
}
public static void main(String args[])
{
System.out.println("引用基本类型常量:120");
System.out.println("引用String类型常量:select *From SCOTT;");
}
}
我操,居然没有引用到Constant的变量,而是把他们的值。
总结:
对于final 修饰基本类型和String类型的,我们的智能IDE编译器会认为它是稳定态的,所以在编译器是就直接放值编译到了字节码中了,避免了运行期的引用,提高效率。
维护工作中如果咱们只对类似Constant类的重新发布,结果显然易见就是--莫名其妙被坑了...