Java类、方法(自定义场景)注释模板及解析

概述

本文主要讲述在平时日常工作中使用的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$){&#10;    return &quot;&quot;;&#10;}&#10;&#10;" 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$){&#10;    &#10;}" 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$){&#10;    $END$&#10;}" 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$){&#10;    &#10;}" 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$){&#10;    return &quot;&quot;;&#10;}" 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$){&#10;    return &quot;&quot;;&#10;}" 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$){&#10;    &#10;}" 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$){&#10;    return &quot;&quot;;&#10;}&#10;" 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$){&#10;    &#10;}" 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$
   */
NameExpressionDefault valueSkip if defined
EndN
ParamsmethodParameters()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
ReturnTypemethodReturnType()groovyScript("def result=\"${_1}\"; if(result == \"void\"){return \"\";}else{return \"{@link \"+result+\"}\";}", methodReturnType())N
datedate()N
timetime()N

DefaultValue我并没有认真研究过,这里就不过多赘述了。

从网上搜的groovy脚本:

变量groovy脚本
returngroovyScript("def params=\"${_1}\"; if(params=='void'){return '';} else {return '\n\t * @return ' + params}", methodReturnType())
paramgroovyScript("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生成,喜欢自取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值