• Java类字段可以用基本数据类型吗?
  • 发布于 1个月前
  • 71 热度
    0 评论
先说结论
答案是不可以,CR的时候看到有人这么干,不要犹豫,直接开喷即可。为什么我们不推荐在entity的字段中用基本类型呢?比如有这样一个类:
public class OrderLine{

    @TableId(type = IdType.AUTO)
    private Long id;
    private int status;
    //其他字段省略
}
大家想一想,比如在某个业务场景,我们new了一个OrderLine对象,或者用BeanUtils之类的工具拷贝了properties,而status没有值,再去做update的时候,就会因为int默认是0,而去把数据库里面原有的值给覆盖了,从而造成很多脏数据,而且很难排查问题。同样的,如果是通过feign或者http去调用第三方接口,返回的DTO也不要用基本类型,原因是一样的。

延伸一下
一个第三方接口返回的参数中,一般都有一个是否成功的字段,比如

为什么不能用boolean呢?因为第三方接口如果没有返回success,而boolean是基本类型,默认是false,我们就不知道到底是因为接口没返回值导致的false,还是接口主动返回了false,这就产生了二义性。

但是用Boolean一定没问题吗,也不是,这不,我就曾经遇到了这个问题,还背了锅。
public void handleCompleteEvent(CompleteEvent event) {
    sysEventService.execute(event.getSysBiz(),event.getBizUid(),event,(dto)->{
        CompleteTransportCmd body = event.getBody();
        Result<Void> result = otherApiService.completeTransport(body);
        if(!result.getSuccess()){
            log.error("回传订单失败");
        }
    });

}
先看上面一段代码,乍一看没啥问题,但是这个功能一上线就频繁接到飞书报警,最终定位到这个地方,原来我们系统上线了,但是接口服务方因为某些原因,导致success这个字段是空的,导致在这里判断的时候直接报NPE了。虽然是第三方系统的问题,但是为了保障程序的健壮性,还是把代码改成了
if(result.getSuccess() != null && !result.getSuccess()) {
    log.error("回传订单失败");
}

用户评论