IDEA自定義模板註釋(解決了引數與返回值為空的問題)

2020-10-25 13:00:25

前言

相信很多人在設定模板註釋的時候,尤其是在設定方法模板註釋時,都遇到了各種問題(比如引數和返回值為空的情況)。也都在網上進行了很多搜尋,但是你懂得,最終都無功而返,本文則將為你解決這一問題,由於設定類的模板註釋很簡單,網上搜尋的方法也都可以解決生成類的模板註釋的情況,因此本文不做介紹,將只介紹如何生成方法模板註釋,此外還會詳細介紹使用到的Groovy指令碼的具體含義,以便你可以寫你自己的Groovy指令碼,滿足你自己的需求,在最後還會通過一個Gif動圖,來展示具體的使用方法,話不多說,開始介紹。

建立模板

首先點選File -> Settings -> Editor -> Live Templates,會出現以下介面:

image-20201022101321942

然後我們需要點選+,選擇Template Group...

image-20201022101455162

然後隨便取一個名字,點選OK

image-20201022101636732

然後按照下圖,首先選中我們剛建立的Group,然後點選+並選擇Live Template:

image-20201022101834531

然後在彈出的介面先填入圖中標註的資訊:

image-20201022102035375

圖中1處的位置按照傳統(相信大多數人以前也是這麼設定的)就繼續用*了,對應的Template text如下:

**
 * description
$params$
 *
$return$
 * @author zjw
 * @createTime $date$ $time$
 */
注意

這裡需要特別注意,Template text的內容最開始處不可以是/**開頭,否則會出現引數和返回值為空的情況,看到這裡你可能覺得你之前也這樣設定過,也是不起作用,但是請你繼續看下去,因為我之前也遇到過,此外我這裡的Template text也是為了配合之後指令碼的程式碼,所以看起來可能不太一樣。

然後需要需要按照下圖的步驟設定一下Application Contexts,需要選擇Java,結束之後記得點選一下Apply

image-20201022103830214

設定指令碼

完成了以上步驟後,就可以開始設定對應的指令碼了,按照下圖步驟,並在23處分別輸入以下兩個Groovy指令碼(指令碼含義稍後介紹),45處在下拉框中選擇系統預設的即可:

groovyScript("def result='';def flag=false;def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {if (!params[i].equals('')) {flag=true;result+='* @param ' + params[i] + ' ' + params[i] + ((i < params.size() - 1) ? '\\n\\t ':'')} else {result+=' *'}}; return flag ? ' *\\n\t ' + result : result", methodParameters())

groovyScript("def params=\"${_1}\";def index=params.lastIndexOf('.', params.indexOf('<'));if(index!=-1){params=params.substring(index+1);};index=params.indexOf('.');if(index!=-1&&params.indexOf('<')==-1){params=params.substring(index+1);};return ' * @return ' + params.replaceAll('java.lang.', '').replaceAll(',',', ');", methodReturnType())

image-20201022113313982

完成一點設定後點選OKApply即可使用我們的模板啦。

註釋使用測試

在講解上述Groovy指令碼的含義之前,先來看一下我們上述設定的註釋模板如何使用:
我們只需要在需要新增註釋的方法上輸入/*然後按下Tab即可生成,這裡的*對應著上述的Abbreviation裡設定的*,等於使用*去替換上述設定的Template text,並在Template text前加了一個/,即可成功新增我們的註釋模板,對應的Gif操作動圖如下:

demo

demo1

指令碼含義介紹

這裡以設定$return$的指令碼為例,為了解釋方便,將指令碼做了一些格式化,程式碼及其含義直接如下,GroovyJava的語法很相似,所以不難理解:

groovyScript("
        // 將 methodReturnType() 的返回值轉化為字串賦給 params
        // 預設的返回值格式為 pojo.User / java.lang.int 等形式
        def params = \"${_1}\";
        
        // 如果返回值有集合時,原始形式為 java.util.List<java.lang.Integer> 這種形式
        // 這裡獲取 '<' 前的 '.' 下標
        def index = params.lastIndexOf('.', params.indexOf('<'));
        
        if (index != -1) {
            // 執行到這裡說明返回值有泛型,為了看著更舒服
            // 這裡的作用是把 java.util.List<java.lang.Integer> 變為 List<java.lang.Integer>
            params = params.substring(index + 1);
        };
        
        // 這裡繼續獲取 '.' 的下標
        index = params.indexOf('.');
        
        // 如果 '.' 存在,且不存在 '<' 說明返回值沒有泛型
        if (index != -1 && params.indexOf('<') == -1) {
            // 把返回值為 pojo.User 這種變為 User
            params = params.substring(index + 1);
        };
        
        // 當返回值為基本型別時,都會有 'java.lang.' 字首
        // 例如 java.lang.int ,這裡去掉了 java.lang.
        // 此外將返回結果中的 ','替換為', '是為了處理 有多個泛型引數的情況
        // 例如原始返回值可能為 java.util.Map<java.lang.Integer,java.lang.String>
        // 這裡為了讓泛型之間的 ',' 變成 ', ' 更加美觀
        // 需要注意的是,我沒有處理 java.util.List<pojo.User> 這種情況
        // 經過這些程式碼只會變為 List<pojo.User>, 這個就留給大家自己做了
        return ' * @return ' + params.replaceAll('java.lang.', '').replaceAll(',', ', ');
    ",
    methodReturnType()
)

注意

我這裡只展示了處理return的指令碼程式碼的所有含義,程式碼中也顯得有些醜陋,所以還是希望各位能寫出各自的Grovvy指令碼,然後分享一下,因為我的param的指令碼寫的太醜了,這裡就不做講解了,如果有問題,你也可以進行留言。

總結

本文講解了使用IDEA生成自定義方法模板註釋可能會遇到的一些問題,當然可能因為一些版本原因,或者操作原因,你可能仍然會遇到一些問題,也歡迎你進行留言,一起討論。