欢迎关注微信公众号:互联网全栈架构
小张是一个程序员,初入职场不久,头衔是初级开发工程师,他负责一个软件模块的开发和维护,经过自己的不断努力和持续改进,模块的功能日趋完善,运行也越来越稳定,但最近系统出了个bug,而且是偶发的(也就是说有些情况不行,有些情况又可以),这就让小张有点丈二摸不着头脑,搞不清楚到底是哪里出了问题,完全是一脸懵逼的状态。
为了讲解方便,我们把问题做一下简化。在小张维护的模块中,会根据订单的状态打印出对应的信息,像下面这样:
public void printOrderStatus(Integer status){
if(status == 0){
System.out.println("订单已创建");
}
if (status == 2){
System.out.println("订单已配送");
}
}
后面新增了一种订单状态,叫做已反馈,出于系统兼容的考虑,把状态的值设计得比较大:200,如果客户对于订单进行了反馈,就会把数据库中的字段status值设置为200。
当然,针对这样的改动,小张也是毫不费力就完成了,无非就是新增一个if判断而已,之前的程序都运行得好好的,再加一个if判断,那也肯定不会有任何问题。
小张也是追求完美的人,对于这种状态码,也对应地设计了一个枚举类,整体的代码如下:
package com.sample.core.basic;
enum StatusEnum{
ORDERED(0, "已下单"),
PAYED(1, "已支付"),
DELIVERED(2, "已配送"),
FINISHED(3, "已完成"),
FEEDBACK(200, "已反馈");
private Integer code;
private String desc;
StatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
public class IntegerCacheExample {
public static void main(String[] args) {
IntegerCacheExample integerCacheExample = new IntegerCacheExample();
integerCacheExample.printOrderStatus(200);
}
public void printOrderStatus(Integer status){
if(status == StatusEnum.ORDERED.getCode()){
System.out.println("订单已创建");
}
if(status == StatusEnum.DELIVERED.getCode()){
System.out.println("订单已配送");
}
if (status == StatusEnum.FEEDBACK.getCode()){
System.out.println("订单已反馈");
}
}
}
然而,对于新增的已反馈的状态,却怎么样也打印不出信息,但其它的订单状态是没问题,就像上面的代码,应该打印出“订单已反馈”的信息,但控制台上并没有打印出来。
小张确实有点懵了,一样的状态,只是数字的值不一样而已,怎么会有不同的表现呢?
小张百思不得其解,于是请教了旁边的资深工程师老王,老王看了看代码,瞬间明白了问题所在,他笑了笑,点开了类Integer的定义,并定位到了内部类IntegerCache,小张仔细阅读代码,终于明白了问题的根本原因,原来Integer把-128到127之间的数字被缓存了起来,如果不在这个范围,那就重新new一个,而自己的代码是用==而不是equals,当然就返回false了:
看似没问题的代码,竟然还藏着这样的“坑”,这也给小张上了一课:编程真是一门严谨的学问啊。
推荐阅读: