发布项目时不要只替换一个class类

探讨了在Java中使用final修饰的基本类型和String类型的常量,在编译期间会被直接放入字节码文件中,而不是作为引用存在。这可能导致在更新这些常量值时出现意料之外的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类的重新发布,结果显然易见就是--莫名其妙被坑了...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值