为什么不能用 isXXX

首先我们来看阿里巴巴的《Java开发手册》关于 isXXX 是怎么定义的吧:

【强制】POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

我们再来看一段 IDE 生成的 getter/setter 代码:

public class Staff {

    private String name;
    private boolean graduated;
    private boolean isMarried;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isGraduated() {
        return graduated;
    }

    public void setGraduated(boolean graduated) {
        this.graduated = graduated;
    }

    public boolean isMarried() {
        return isMarried;
    }

    public void setMarried(boolean married) {
        isMarried = married;
    }

}

变量 isMarried 生成的 getter/setter 方法是:isMarried/setMarried,有些框架就会去找对应的 married 变量,然后就找不到了…

再看变量 graduated,因为都是 boolean 变量,所有生成的逻辑和 isMarried 一样,根据上述规范,它不会产生找不着值的情况,这也是为什么不建议使用 isXXX 的命名形式。

这个问题我之前有个同事在使用某个 Web 框架的时候就遇到过,在页面上使用该框架的标签显示对象的值,如:xx.xxx,然后就死活取不到值,还报异常,最后定位就是这个问题。

https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247491895&idx=1&sn=51ea97db0b5bcdd46a5b6b1751cc6a98&chksm=eb506401dc27ed170ece2bddc88d7bc776d5472544923775dc1cb50033e3621088912ea4e44d&mpshare=1&scene=1&srcid=&sharer_sharetime=1578213362017&sharer_shareid=e1d4a35ff3308c63451b2ff386b1e2bd&key=3bbb5634782017ab25de3e923a5512f2f5f7982ce8d092eae4e69a7285884c7049297f6216bed52c3838474475be31a2a59a17a792c7a07119af36c40f4f724326a5535c6f64df2b1dd7c3fc49f54113&ascene=1&uin=NjU1MzgyNTYw&devicetype=Windows+7&version=62070158&lang=zh_CN&exportkey=Afx7yiO%2FVmrD56xza6RmGuE%3D&pass_ticket=j%2FwSPuK0UAUTUhMhoWyfwxs8zS2w2%2FlQ1QmSXZ%2FezYK0sj33GZ44m3P9meFiNznh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值