基础数据类型boolean与包装类Boolean以及Lombok的@Data注解在字段以isXxx命名的影响
数据类型、数据名称、生成方式对于getter&setter方法以及序列化&反序列化的影响
·
1. boolean&Boolean类型的字段生成getter&setter方法差异示例
/**
* boolean类型、idea快捷生成
*/
public class JavaBean {
private boolean delete;
public boolean isDelete() {
return delete;
}
public void setDelete(boolean delete) {
this.delete = delete;
}
}
/**
* Boolean类型、idea快捷生成
*/
public class JavaBean {
private Boolean delete;
public Boolean getDelete() {
return delete;
}
public void setDelete(Boolean delete) {
this.delete = delete;
}
}
这里可以看到:
boolean类型生成的getter&setter方法与Boolean类型生成的getter方法有所不同
- boolean类型的getter方法按照isXxx格式命名
- Boolean类型的getter方法与其他基本数据类型的包装类型一致按getXxx格式命名
2. isXxx&xxx格式的字段名比较boolean&Boolean,以及在使用lombok注解@Data时getter&setter方法有什么变化
/**
* isXxx、boolean类型
*/
public class JavaBean {
private boolean isDelete;
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
/**
* isXxx、Boolean类型
*/
public class JavaBean {
private Boolean isDelete;
public Boolean getDelete() {
return isDelete;
}
public void setDelete(Boolean delete) {
isDelete = delete;
}
}
/**
* isXxx、boolean类型,lombok组件@Data反编译结果
*/
public class JavaBean {
private boolean isDelete;
public boolean isDelete() {
return this.isDelete;
}
public void setDelete(boolean isDelete) {
this.isDelete = isDelete;
}
}
/**
* isXxx、Boolean类型,lombok组件@Data反编译结果
*/
public class JavaBean {
private Boolean isDelete;
public Boolean getIsDelete() {
return this.isDelete;
}
public void setIsDelete(Boolean isDelete) {
this.isDelete = isDelete;
}
}
- isXxx、boolean类型的getter&setter方法:isDelete和delete生成了一模一样的getter&setter方法
- isXxx、Boolean类型的getter&setter方法:isDelete和delete生成了一模一样的getter&setter方法
- isXxx、boolean类型,使用lombok组件@Data:反编译结果显示lombok自动生成的getter&setter方法和手动生成的一致
- ixXxx、Boolean类型的getter&setter方法: 反编译结果显示lombok自动生成的getter&setter方法名和手动生成的都不一样
3.常见序列化与反序列化工具类对于getter&setter方法名的影响
我们从日常开发中选择比较常用的三种JSON转换组件 fastjson、jackson、gson,以这三个为例测试一下xxx和isXxx格式在各种场景下序列化和反序列化的情况
案例如下:
/**
* isXxx、boolean类型
*/
public class JavaBean {
private boolean isDelete;
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
public void example01() throws JsonProcessingException {
JavaBean javaBean = new JavaBean();
javaBean.setDelete(true);
String jsonStr = JSON.toJSONString(javaBean);
log.info("javaBean:{}", jsonStr);
JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
log.info("transferBean:{}", JSON.toJSONString(transferBean));
//输出1: javaBean:{"delete":true}
//输出2 : transferBean:{"delete":true}
ObjectMapper objectMapper = new ObjectMapper();
jsonStr = objectMapper.writeValueAsString(javaBean);
log.info("javaBean:{}", jsonStr);
transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));
//输出1: javaBean:{"delete":true}
//输出2 : transferBean:{"delete":true}
Gson gson = new Gson();
javaBean = gson.fromJson(jsonStr, JavaBean.class);
log.info("javaBean:{}", gson.toJson(javaBean));
transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
log.info("transferBean:{}", gson.toJson(transferBean));
//输出1: javaBean:{"delete":false}
//输出2 : transferBean:{"delete":false}
}
/**
* isXxx、Boolean类型
*/
public class JavaBean {
private Boolean isDelete;
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
public void example02() throws JsonProcessingException {
JavaBean javaBean = new JavaBean();
javaBean.setDelete(true);
String jsonStr = JSON.toJSONString(javaBean);
log.info("javaBean:{}", jsonStr);
JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
log.info("transferBean:{}", JSON.toJSONString(transferBean));
//输出1: javaBean:{"delete":true}
//输出2 : transferBean:{"delete":true}
ObjectMapper objectMapper = new ObjectMapper();
jsonStr = objectMapper.writeValueAsString(javaBean);
log.info("javaBean:{}", jsonStr);
transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));
//输出1: javaBean:{"delete":true}
//输出2 : transferBean:{"delete":true}
Gson gson = new Gson();
javaBean = gson.fromJson(jsonStr, JavaBean.class);
log.info("javaBean:{}", gson.toJson(javaBean));
transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
log.info("transferBean:{}", gson.toJson(transferBean));
//输出1: javaBean:{}
//输出2 : transferBean:{}
}
/**
* isXxx、Boolean类型,lombok组件@Data反编译结果
*/
public class JavaBean {
private Boolean isDelete;
public Boolean getIsDelete() {
return this.isDelete;
}
public void setIsDelete(Boolean isDelete) {
this.isDelete = isDelete;
}
}
public void fieldNamingFormatForIs() throws JsonProcessingException {
JavaBean javaBean = new JavaBean();
javaBean.setIsDelete(true);
String jsonStr = JSON.toJSONString(javaBean);
log.info("javaBean:{}", jsonStr);
JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
log.info("transferBean:{}", JSON.toJSONString(transferBean));
//输出1: javaBean:{"isDelete":true}
//输出2 : transferBean:{"isDelete":true}
ObjectMapper objectMapper = new ObjectMapper();
jsonStr = objectMapper.writeValueAsString(javaBean);
log.info("javaBean:{}", jsonStr);
transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));
//输出1: javaBean:{"isDelete":true}
//输出2 : transferBean:{"isDelete":true}
Gson gson = new Gson();
javaBean = gson.fromJson(jsonStr, JavaBean.class);
log.info("javaBean:{}", gson.toJson(javaBean));
transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
log.info("transferBean:{}", gson.toJson(transferBean));
//输出1: javaBean:{"isDelete":true}
//输出2 : transferBean:{"isDelete":true}
}
结论:综上可观察到,isXxx格式在序列化和反序列化时根据不同情况和不同工具类,差异不小,可能在日常开发中稍不注意,就会导致有效字段的值填充不到位。
4.boolean属性名避免使用 “is” 开头的名称
1.阿里java开发规范提到:
2.javaBeans规范中对这些均有相应的规定,基本数据类型的属性,其getter和setter方法是getXXX()和setXXX,但是对于基本数据中布尔类型的数据,又有一套规定,其getter和setter方法是isXXX()和setXXX,但是包装类型都是以get开头。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)