2020-09-16 说一说之前写项目中遇到的一个坑关于实体类中的布尔类型为什么不能用isxxxxx进行命名

对应阿里巴巴开发手册第一章的命名风格的第八条。
【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
对于这样一条【强制】级别的规定,虽然规范中做了简单的说明,但依然显得很不起眼,以至于很多人依然踩到了这个坑。
当你使用快捷键进行生成getset方法时他会把“is”给吃掉,问题就出在private boolean isAtAll;这个字段上,有没有发现阿里的这个参数违背了开篇提到的开发规范?使用fastjson序列化之后,该属性实际转化为了:“atAll”: true。
具体是什么原因呢,百度之后找到了一篇文章: POJO类中布尔类型为啥不让用isXxx命名 中有提到
为什么序列化之后把is吃了呢?带着这个问题我追踪了一下fastjson的源码,发现在序列化的时候,其使用的是属性的getter方法名,而isAtAll字段自动生成的getter、setter为:

public boolean isAtAll() {
    return isAtAll;
}

public void setAtAll(boolean atAll) {
    isAtAll = atAll;
 }

对应的fastjson中对方法名的处理在com.alibaba.fastjson.util.TypeUtils.computeGetters中,源码摘录如下:

if(methodName.startsWith("is")){
    if(methodName.length() < 3){
        continue;
    }
    if(method.getReturnType() != Boolean.TYPE
            && method.getReturnType() != Boolean.class){
        continue;
    }
    String propertyName;
    Field field = null;
    if(Character.isUpperCase(c2)){
        if(compatibleWithJavaBean){
            propertyName = decapitalize(methodName.substring(2));
        } else{
            propertyName = Character.toLowerCase(methodName.charAt(2)) + methodName.substring(3);
        }
        propertyName = getPropertyNameByCompatibleFieldName(fieldCacheMap, methodName, propertyName, 2);
    }

也就是说,对于is开头的方法,fastjson先把第3个字符截取出来,如果该字符是大写,就转换为小写,并且拼装剩余的方法名组成属性名。

例如:isAtAll方法拼装出来的属性名就是atAll,最终结果就是把我们的is给吃了

所以解决方法就是不要用isxxx命名就最简单粗暴

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值