概述
本文主要讲述在平时日常工作中使用的Java类、方法注释所需要的模板。
- File and Code Templates
- Live Template
为什么要配置这个模板? 1、提高效率 2、工作留痕
1、类注释模板(常用)
本文使用 IDEA<2020.2>为例,更高版本大同小异。
1.1、设置
打开:
File -> Settings -> File and Code Templates -> Includes -> File Header -> 编辑
1.1.1、Scheme
Scheme(方案) Scheme 设置有两个选项:Default 和 Project Default 范围控制应用于任何项目中整个工作区的模板。它们存储在 fileTemplates 下的 IDE 配置目录中。 Project 范围控制只应用于当前项目的模板。它们存储在 .idea/fileTemplates 下的 project 文件夹中。这些模板可以在团队成员之间共享。
1.1.2、模板类型
IntelliJ IDEA 使用了几种类型的模板,分为以下选项卡: Files 选项卡包含用于创建新文件的文件模板。 Includes 选项卡包含可插入到文件模板中的可重用内容(例如,一个特定的头应用于多个文件模板)。 Code 选项卡包含 IntelliJ IDEA 用来生成各种构造的代码片段(片段)的内部模板。您可以编辑此选项卡上可用的代码段,但不能创建新的代码段。要创建自定义代码片段,请使用 Live Templates。 Other 选项卡包含各种应用服务器和框架使用的模板。您可以在此选项卡上编辑现有的内置模板,但不能创建新的模板。
1.1.3、界面内容
在每个选项卡下都有一下模块:模板列表、模板预览、描述。 模板列表:可以对模板进行新增、删除、复制等操作。 模板编辑:对选中模板内容进行编辑,通过勾选可以实现: 根据风格重新格式化 启用 Live Templates 描述:是对配置用法进行说明。
File and Code Templates 设置是我们创建指定文件、类、枚举、代码等不同类型文件时所用的模板。
注意:没有必要请不要碰include以外的模板,虽然可以reset、

我们可以看到Files中存在:
1、Class 2、Interface 3、Enum 4、AnnotationType
这也是我们java常用的几种文件类型。
Class的默认模板是:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public class ${NAME} {
}
这里要说明一下:
IntelliJ IDEA 的文件代码模板是支持Velocity Template Language(VTL)的,我们的模板也正是使用这个语法。
我们可以发现存在一行代码:
#parse("File Header.java")
这行代码主要是说明我们再创建类时引用了一个叫做File Header.java的模板
同理:接口、枚举、注释也都是这样。
1.2、新增/修改模板
正常来说,普通的企业都要求开发者对自己的代码留痕。记录我们创建的类、实体等的描述、时间。
而我们类、接口、方法基本都会用同一个模板。所以我们就不新增模板了,直接在File Header.java模板中进行修改。当然,如果你新增了模板,需要修改对应的引用语句。
模板样例:
/**
* ${description}
*
* @since: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
**/
1.3、VTL(Velocity Template Language)预设变量
文件代码模板(VTL)预设的变量 :
${PACKAGE_NAME} - the name of the target package where the new class or interface will be created.
${PROJECT_NAME}- the name of the current project.
${FILE_NAME}- the name of the PHP file that will be created.
${NAME}- the name of the new file which you specify in the New File dialog box during the file creation.
${USER}- the login name of the current user.
${DATE}-the current system date.
${TIME}-the current system time.
${YEAR} - the current year.
${MONTH} - the current month.
${DAY}-the current day of the month.
${HOUR} - the current hour.
${MINUTE}-the current minute.
${PRODUCT_NAME}- the name of the IDE in which the file will be created.
${MONTH_NAME_SHORT} - the first 3 letters of the month name. Example: Jan, Feb, etc.
${MONTH_NAME_FULL} - full name of a month. Example: January, February, etc.
1.4、后记
当我们保存过后,可以发现,我们创建Class的时候会额外弹出一个叫做description的输入框
而这个输入框就来源于:${description}
然而我们并没有发现${description}出现在上面我们阐述的语法中。
我们可知:
${}这个是个独立的语法,花括号中的内容我们可以随便写,写的什么就是我们创建Class弹出的第二个窗口中的左侧标题内容。
但是花括号中的内容不支持中文,当你在模板中修改成中文后,${中文}会变成一个常量,不会触发弹窗
/**
* ${whatcanisay}
* ${中文}
*
* @since: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
**/
如果使用上面这个模板,就只会弹出whatcanisay输入框了。
2、方法(自定义场景)注释模板(不常用)
我们入职时一般大型企业会让我们导入公司准备好的CodeCheck模板、代码格式化规范等。不同公司的代码模板是不同的,这里就不过多赘述了。
我们以方法的描述,以及出入参为标准来演示如何修改创建方法的模板。
2.1、设置
打开设置:
1、打开Preferences 2、Editor -> Live Templates -> 点击右边加号为自己添加一个Templates Group -> 然后选中自己的Group再次点击加号添加Live Templates 3、请不要修改原有的模板,如果我们有需要就新增一个组与模板。模板可以自行选择是否启用。

页面布局:
By default expand with: 补全方式,这个设置不需要修改。
Abbreviation 缩略词、触发前缀。 触发前缀会优于引用的包等展示。 系统java默认有的: sout等等
Description 描述,当我们输入前缀后可以看到描述。
Template text 模板正文,当我们对一些自定义场景套用模板时,就需要新增、修改里面的内容。 我们可以自定义声明变量,语法是$$,两个$中间可以随便取英文。
Edit variables 编辑变量,这里的变量指的是我们模板中声明的自定义变量。 支持强大的预定义函数,而这个函数可以参考官网文档,以及网上的介绍。这里不过多赘述 这里简单介绍一下两个函数: complete() 光标跳转到该变量位置时会打开智能补全,不确定要用什么就用它; methodReturnType() 使用当前方法的返回类型设置当前变量。
Options Expand with : 展开按键,默认习惯是Enter Reformat according to style: 对生成的代码重新格式化(建议勾选)。 use static import if possible :使用静态导入 Shorten FQ names :缩短全类名,自动添加import
Application 应用范围,选择java就好,当然如果你有Kotlin等诉求,多选点也无所谓。
官方文档:
https://www.jetbrains.com/help/idea/template-variables.html#pdtv
2.1.1、预定义变量
Live Templates预定义两个变量
| 变量名 | 描述 |
|---|---|
| $END$ | 光标的最后位置 |
| $SELECTION$ | 填充被选中内容 |
https://www.jetbrains.com/help/idea/template-variables.html#pdtv
2.1.2、预定义函数
列举几个常用的预定义函数翻译一下
| 变量名 | 描述 |
|---|---|
| className() | 返回当前类名 |
| classNameComplete() | 选择类名进行返回 |
| complete() | 替代变量的代码 |
| completeSmart() | 替代变量智能类型代码 |
| currentPackage() | 当前包全路径 |
| date(sDate) | 当前时间,可以填写格式 |
| fileName() | 文件名与扩展 |
| fileNameWithoutExtension() | 文件名不含扩展 |
| lineNumber() | 返回当前行号 |
| methodName() | 返回所在方法名 |
| methodParameters() | 返回当前方法参数列表,数组形式,形如[a, b]time(sSystemTime) 返回当前时间,可以设置格式 |
| user() | 返回当前系统用户 |
2.1.3、使用快捷键
环绕选中
| 快捷键 | 描述 |
|---|---|
| Ctrl+J | 弹出所有模板,输入对应快捷内容,Tab进行选中;环绕选中,会弹出含有的模板 |
| Ctrl+Alt+T | 弹出所有环绕模板,包括if、while、try等模板 |
针对Java快捷模板内容
<templateSet group="Java">
<template name="puss" value="public static String $END$($CLASS_NAME$ $VARIBLE_NAME$){ return ""; } " description="公共静态方法,返回值为String" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="pusv" value="public static void $END$($CLASS_NAME$ $VARIBLE_NAME$){ }" description="公共静态方法,返回值为void" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="commentStart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="fe" value="for ($ELEMENT_TYPE$ $VAR$ : $SELECTION$){ $END$ }" description="foreach遍历选中内容" toReformat="false" toShortenFQNames="true">
<variable name="ELEMENT_TYPE" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="VAR" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="td" value="// TODO $DATE$ $USER$ $END$" description="TODO注释带时间" toReformat="false" toShortenFQNames="true">
<variable name="DATE" expression="date()" defaultValue="" alwaysStopAt="false" />
<variable name="USER" expression="user()" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="prsv" value="private static void $END$($CLASS_NAME$ $VARIBLE_NAME$){ }" description="私有静态方法,返回值为void" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="commentStart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="prss" value="private static String $END$($CLASS_NAME$ $VARIBLE_NAME$){ return ""; }" description="私有静态方法,返回值为String" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="prs" value="private String $END$($CLASS_NAME$ $VARIBLE_NAME$){ return ""; }" description="私有方法,返回值String" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="prv" value="private void $END$($CLASS_NAME$ $VARIBLE_NAME$){ }" description="私有方法,返回值void" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="pus" value="public String $END$($CLASS_NAME$ $VARIBLE_NAME$){ return ""; } " description="公共方法,返回值为String" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
<template name="puv" value="public static void $END$($CLASS_NAME$ $VARIBLE_NAME$){ }" description="公共方法,返回值为void" toReformat="false" toShortenFQNames="true">
<variable name="CLASS_NAME" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
<variable name="VARIBLE_NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>
</templateSet>
2.2、新增/修改模板

/** * @Application [$End$] * @Description * * * @Param $Params$ * @Return $ReturnType$ * * @Author [ xxx ] * @Version [ v1.0 ] * @Date $date$ $time$ */
| Name | Expression | Default value | Skip if defined |
|---|---|---|---|
| End | N | ||
| Params | methodParameters() | groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\[|\\]|\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @Param ' + params[i] + ((i < params.size() - 1) ? '\r\n' : '')}; return result", methodParameters()) | N |
| ReturnType | methodReturnType() | groovyScript("def result=\"${_1}\"; if(result == \"void\"){return \"\";}else{return \"{@link \"+result+\"}\";}", methodReturnType()) | N |
| date | date() | N | |
| time | time() | N |
DefaultValue我并没有认真研究过,这里就不过多赘述了。
从网上搜的groovy脚本:
| 变量 | groovy脚本 |
|---|---|
| return | groovyScript("def params=\"${_1}\"; if(params=='void'){return '';} else {return '\n\t * @return ' + params}", methodReturnType()) |
| param | groovyScript("def result='\n'; def params=\"${_1}\".replaceAll('[\\[|\\]|\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {if(i == 0 && params[i] == ''){return '';};result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\n' : ' ')}; return result", methodParameters()) |
2.3、后记
自定义场景其实在开发中用的场景不是很多。
当然如果你有这种诉求,即可自定义这些场景。具体怎么使用就见仁见智了。
3、引用、参考资料
本文是在查阅大神的参考资料,以及实际使用中再整理的。
传播本文时请标注作者以及以下文献。感谢这些大佬:
1、https://blog.csdn.net/A_finder/article/details/100068008 2、https://blog.csdn.net/ShiJunzhiCome/article/details/105639306 3、https://wenku.baidu.com/view/648d458a5df7ba0d4a7302768e9951e79b8969d2.html?_wkts_=1758646816414&bdQuery=Use+static+import+if+possible 4、https://cloud.tencent.com/developer/article/2158313 5、https://blog.csdn.net/Li_Ya_Fei/article/details/118252532

封面图为AI生成,喜欢自取。


724

被折叠的 条评论
为什么被折叠?



