解决当boolean类型的变量命名由is开头时,IDEA⾃动⽣成get、set
⽅法的问题
解决当boolean类型的变量命名由is开头时,IDEA⾃动⽣成get、set⽅法的问题
⼀、背景
阿⾥巴巴Java开发⼿册中对POJO类中布尔类型的变量命名有明确规定
【强制】 POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。
说明:在本⽂ MySQL 规约中的建表约定第⼀条,表达是与否的值采⽤ is_xxx 的命名⽅式,所以,需要在
<resultMap>设置从 is_xxx 到 xxx 的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的⽅法也是 isDeleted(), RPC 框架在反向解
析的时候, “误以为” 对应的属性名称是 deleted,导致属性获取不到,进⽽抛出异常。
主要原因就是在部分框架中这种命名⽅式会导致部分框架解析错误,但是当我们遇到⽼系统中已经存在⼤量不规范的命名时,该如何解决呢?⼆、现象
当我们在⼀个类中定义了Boolean或者boolean类型的变量,并且命名时使⽤is开头
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
}
当我们使⽤IDEA默认的配置⽣成get、set⽅法(快捷键:alt+insert)
会得到
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
public Boolean getEnable() {
return isEnable;
}
public void setEnable(Boolean enable) {
isEnable = enable;
}
public boolean isDelete() {
idea的快捷键return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
}
我们发现,当变量为Boolean类型时,⽣成的get、set⽅法会⾃动去掉is;当变量为boolean时,get⽅法变为了
isDelete,set⽅法⾃动去掉is。这会导致部分框架在解析的时候报错。
三、解决办法
修改IDEA⽣成get、set⽅法的模板,将上述情况下的变量⽣成时不忽略is。先⽤快捷键alt+insert打开菜单,点击Getter and Setter
然后点击Getter template和Setter template后⾯的按钮,增加⾃定义模板
⾃定义Getter template为:
#set($paramName = $ParamName($field, $project))
#if($difierStatic)
static ##
#end
$pe ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($PropertyName($field, $project))))
#if ($field.name == $paramName)
get##
#else
getIs##
#end
${name}() {
return this.##
}
⾃定义Setter template为:
#set($paramName = $ParamName($field, $project))
#if($difierStatic)
static ##
#end
void ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($PropertyName($field, $project)))) #if ($field.name == $paramName)
set##
#else
setIs##
#end
${name}($pe $paramName) {
#if (!$difierStatic)
this.##
#else
$classname.##
#end
$field.name = $paramName;
}
点击+号新增即可,Setter template也是⼀样的操作
添加完成后,⽣成get、set⽅法时,使⽤⾃定义模板即可
public class TestVO {
private Boolean isEnable = false;
private boolean isDelete = false;
public Boolean getIsEnable() {
return this.isEnable;
}
public void setIsEnable(Boolean enable) { this.isEnable = enable;
}
public boolean getIsDelete() {
return this.isDelete;
}
public void setIsDelete(boolean delete) { this.isDelete = delete;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论