zoukankan      html  css  js  c++  java
  • IDEA Getter/Setter 生成方法名不正

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

  • 相关阅读:
    Docker容器(分享十五)
    oracle数据库迁移主从复制ADG(分享十四)
    mysql数据库迁移主从复制(分享十三)
    rsync+inotify实现服务器之间文件实时同步(分享十三)
    mysql数据库迁移(分享十二)
    数据库迁移(分享十一续集)
    Codeforces 1185G2 Playlist for Polycarp (hard version) 背包,暴力
    Codeforces 747F Igor and Interesting Numbers DP 组合数
    Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火
    Codeforces 1140F 线段树 分治 并查集
  • 原文地址:https://www.cnblogs.com/lixin-link/p/13731771.html
Copyright © 2011-2022 走看看