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()应该是没有问题的。

标签: Java, IDEA

添加新评论