-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Closed
Description
规约原文
9.【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
说明:本文 MySQL 规约中的建表约定第 1 条,表达是与否的变量采用 is_xxx 的命名方式,所以需要在
设置从 is_xxx 到 xxx 的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析时,“误以为”对
应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
问题描述
反例中的例子描述是错误的。
原因:Boolean是包装类型,而包装类型属于引用类型。因此 基本数据类型 Boolean
的描述是错误的。
解释:那么,这句话就有两种情况了,到底是 基本数据类型 boolean isDeleted
,还是 引用数据类型 Boolean isDeleted
呢?
这里我做了个测试,定义一个以 is
前缀开头的字段,使用开发工具生成 get
、set
方法
情况一:基本数据类型 boolean
class Item {
private boolean isDeleted;
public boolean isDeleted() {
return isDeleted;
}
public void setDeleted(boolean deleted) {
isDeleted = deleted;
}
}
情况二:引用数据类型 Boolean
class Item {
private Boolean isDeleted;
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}
情况三:基本数据类型 boolean
class Item {
private boolean deleted;
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}
结论:
对于基本类型
的 boolean 而言,isDeleted 生成出来的 get 方法名还是 isDeleted,即 get 方法名和字段名相同
对于引用类型
的 Boolean 而言,isDeleted 生成出来的 get 方法名是 getDeleted
修改建议
反例:定义为基本数据类型 boolean isDeleted 的字段,它的 getter 方法也是 isDeleted(),部分框架在反向解析时,“误以为”对
应的字段名称是 deleted,导致找不到此字段,进而抛出异常或得到意料之外的结果。
修改点如下:
- 基本数据类型 Boolean -> 基本数据类型 boolean
修改原因:至于为什么可以参考上面,也是最需要修改的地方)- 属性 -> 字段
修改原因:属性包括类成员字段 + getter方法 + setter方法,这里应该是定义字段更合适- 它的方法 -> 它的 getter 方法
修改原因:字段的方法至少包括 getter 方法、setter 方法,这里最好具体说明是 getter 方法才会有此问题,否则会有歧义- 框架 -> 部分框架
修改原因:并不是所有的框架都是使用方法名来获取属性值的,有的框架是通过字段名(如 gson),所以不会有问题,具体测试可以参考本人之前写的一篇文章带你从头到尾解释为什么阿里巴巴规范中强制布尔类型不要加is?三种java的json解析框架jackson、gson、fasterjson的用法和解析- 属性名称 -> 字段名称
修改原因:同第 2 点- 导致属性获取不到 -> 导致找不到此字段
修改原因:如果框架是通过 getter 方法获取属性的值,那肯定可以获取到的。但是有的框架是通过 getter 方法中的名字来反向解析获取字段的值,这个时候才会找不到字段。- 进而抛出异常 -> 进而抛出异常或得到意料之外的结果
修改原因:不一定抛出异常的,取决于框架。
zqq90
Metadata
Metadata
Assignees
Labels
No labels