初级工程师一脸懵逼,高级工程师笑而不语

欢迎关注微信公众号:互联网全栈架构

小张是一个程序员,初入职场不久,头衔是初级开发工程师,他负责一个软件模块的开发和维护,经过自己的不断努力和持续改进,模块的功能日趋完善,运行也越来越稳定,但最近系统出了个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了:

3826802a1f01201ae6e23d58248411fe.png

看似没问题的代码,竟然还藏着这样的“坑”,这也给小张上了一课:编程真是一门严谨的学问啊。

推荐阅读:

“玩转”二叉树:用Java来实现

数据同步的利器:Canal

拒绝空谈:实例演示MySQL事务隔离级别

聊聊MySQL中的死锁

漫谈MySQL中的事务

臭名昭著,怙恶不悛的OOM,到底是什么?

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值