IDEA Getter/Setter 方法名不正
现象
IDEA自动生成Getter/Setter方法时,如果字段是布尔值并且以is
开头,生成的方法会不带Is
。
举个例子:
现在有一个Human
类,有一个布尔类型的isStudent
字段
public class Human {
private Boolean isStudent;
}
如果使用IDEA默认模板会生成
public class Human{
private Boolean isStudent;
public Boolean getStudent() {
return isStudent;
}
public void setStudent(Boolean student) {
isStudent = student;
}
}
但是想要的代码是(方法名不同)
public class Human{
private Boolean isStudent;
public Boolean getIsStudent() {
return isStudent;
}
public void setIsStudent(Boolean isStudent) {
this.isStudent = isStudent;
}
}
导致的问题就是Get、Set方法名不一致的时候,使用工具类举行属性拷贝时数据丢失。
如果意识不到这一点会导致意想不到的结果。
解决办法
在生成Getter/Setter方法时,创建一个模板
Getter模板:
#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if($field.boolean && $field.name.startsWith("is"))
getIs##
#else
get##
#end
${name}() {
return $field.name;
}
Setter模板:
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
void set##
#if($field.boolean && $field.name.startsWith("is"))
Is##
#set($paramName = $field.name)
#end
$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
}
选择这个模板时,生成的方法就会是第二种方案。
后记:
阿里规范中有规定,布尔值不要以is
开头。
反例:定义为基本数据类型Boolean isDeleted的属性,它的方法也是isDeleted(),框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到,进而抛出异常。
不过,isDeleted
属性的方法如果是getIsDeleted()
应该是没有问题的。