相信很多人在設定模板註釋的時候,尤其是在設定方法模板註釋時,都遇到了各種問題(比如引數和返回值為空的情況)。也都在網上進行了很多搜尋,但是你懂得,最終都無功而返,本文則將為你解決這一問題,由於設定類的模板註釋很簡單,網上搜尋的方法也都可以解決生成類的模板註釋的情況,因此本文不做介紹,將只介紹如何生成方法模板註釋,此外還會詳細介紹使用到的Groovy
指令碼的具體含義,以便你可以寫你自己的Groovy
指令碼,滿足你自己的需求,在最後還會通過一個Gif
動圖,來展示具體的使用方法,話不多說,開始介紹。
首先點選File -> Settings -> Editor -> Live Templates
,會出現以下介面:
然後我們需要點選+
,選擇Template Group...
:
然後隨便取一個名字,點選OK
:
然後按照下圖,首先選中我們剛建立的Group
,然後點選+
並選擇Live Template
:
然後在彈出的介面先填入圖中標註的資訊:
圖中1
處的位置按照傳統(相信大多數人以前也是這麼設定的)就繼續用*
了,對應的Template text
如下:
**
* description
$params$
*
$return$
* @author zjw
* @createTime $date$ $time$
*/
這裡需要特別注意,Template text
的內容最開始處不可以是/**
開頭,否則會出現引數和返回值為空的情況,看到這裡你可能覺得你之前也這樣設定過,也是不起作用,但是請你繼續看下去,因為我之前也遇到過,此外我這裡的Template text
也是為了配合之後指令碼的程式碼,所以看起來可能不太一樣。
然後需要需要按照下圖的步驟設定一下Application Contexts
,需要選擇Java
,結束之後記得點選一下Apply
:
完成了以上步驟後,就可以開始設定對應的指令碼了,按照下圖步驟,並在2
和3
處分別輸入以下兩個Groovy
指令碼(指令碼含義稍後介紹),4
和5
處在下拉框中選擇系統預設的即可:
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&¶ms.indexOf('<')==-1){params=params.substring(index+1);};return ' * @return ' + params.replaceAll('java.lang.', '').replaceAll(',',', ');", methodReturnType())
完成一點設定後點選OK
和Apply
即可使用我們的模板啦。
在講解上述Groovy
指令碼的含義之前,先來看一下我們上述設定的註釋模板如何使用:
我們只需要在需要新增註釋的方法上輸入/*
然後按下Tab
即可生成,這裡的*
對應著上述的Abbreviation
裡設定的*
,等於使用*
去替換上述設定的Template text
,並在Template text
前加了一個/
,即可成功新增我們的註釋模板,對應的Gif
操作動圖如下:
這裡以設定$return$
的指令碼為例,為了解釋方便,將指令碼做了一些格式化,程式碼及其含義直接如下,Groovy
和Java
的語法很相似,所以不難理解:
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
生成自定義方法模板註釋可能會遇到的一些問題,當然可能因為一些版本原因,或者操作原因,你可能仍然會遇到一些問題,也歡迎你進行留言,一起討論。