公司之前有一个与第三方团队合作开发的项目,由于过程沟通出现问题,导致整合测试时出现较多问题。其中有一个最经典的就是关于数据类型隐式判断的缺陷修复,追查代码用了2天的时间,后来发现影响范围过大所以没有进行彻底修复(时间、成本包不住)只做了适配处理,下面将说一下大致的情况。
A:主表、B:子表,其中A.id为A表的主键且字段类型是bigint,B.aid为A.id的外键但是B.aid数据类型是varchar类型。
为什么会存在这种数据类型不一致的情况呢?主要有两个原因:
- 跟远程团队之间沟通不畅,管理过程没有有效的沟通机制,同时审查制度没有落实到位为主要原因;
- 其次,项目周期过长,功能经过几轮同事接手,交接又未能交接清楚;
因为数据库中主表id字段数据类型为bigint,子表aid字段数据类型为varchar,因此Java实体中主表实体id的数据类型为Long,而子表实体中aid对应的数据类型为String。好巧不巧,在Java中Long类型是可以通过“equals”和“==”来进行判断,同事们在编写复杂业务逻辑时关于两字段判断的时候一看到String字段触发的判断想都不用想就直接用“equals”来判断,就会出现:
if(aId.equals(id)){
......
}
//对应的数据类型判断就是
if(String.equals(Long)){
......
}
以上写法在IDE中是不会错误提示的,而实际上在编译器层面上也是可以编译通过的。
但实际上数据在流转到这个判断时就会全部判“false”,因为“equals”方法是不会做隐式转换的,所以两个数据类型都不同的情况下是无法进行判断的。所以本次这种情况,最低成本的修改方式是:
if(String.valueOf(Long).equals(String))
先用String.valueOf转换成String再做比较。反之若要判断大小,则将String转换为Long之后再做比较。
标签:判断,Java,String,数据类型,equals,Long,id,隐式 From: https://blog.51cto.com/u_15761576/5888786