解決當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() {
        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 templateSetter template后面的按鈕,增加自定義模板

自定義Getter template為:

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.name == $paramName)
get##
#else
getIs##
#end
${name}() {
return this.##
$field.name;
}

自定義Setter template為:

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
void ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.name == $paramName)
set##
#else
setIs##
#end
${name}($field.type $paramName) {
#if (!$field.modifierStatic)
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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM