首先我们来看阿里巴巴的《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,然后就死活取不到值,还报异常,最后定位就是这个问题。