用Live Templates和Postfix Completion提升编码效率!
引子
在IDEA里输入sout敲回车之后,IDEA会自动补全“System.out.println();”,类似的还有psvm等。出于好奇研究了这个特性,日常开发效率提升了不少,因此分享。
原理简介
好习惯,先看官方文档:
Live Templates : 动态模板,上面提到的sout/psvm等都属于live templates。
Postfix Completion:后缀补全,日常开发用到的"xxx.if"/"xxx.for"都属于postfix completion。
两者原理相似,其实就是用特定的缩写来代替大段代码,提升编码效率。而两者都可以支持自定义,因此只需要简单配置,就可以用几个字母代替大段的代码编写,提升效率。
在使用上的区别就是live template直接输入,IDEA即可联想,Postfix Completion需要跟在"."后面才能联想
配置方法
Live Templates
配置位置:Settings | Editor | Live Templates
配置页面右侧加号,需要配置4个内容
- Abbraviation:编码缩写。示例:psvm
- description:描述,帮助记忆,自行填写。示例:main() method declaration
- Template text:代码段,即缩写带出的内容。示例(这里的$END$代表光标最后停留的位置,下面详述):
public static void main(String[] args){
$END$
}
- Applicable contexts:生效范围,必须勾选,否则缩写不生效,我一般直接勾选java,当然也可以细化。
图示:

根据官方文档,IDEA默认支持的特殊表达式只有两个:
$END$:联想以后光标停留的位置。
$SELECTION$:环绕模板中使用,使用时先用鼠标选中一段代码,$SELECTION$就可以代表这段代码。(回想一下自己option + command + T给代码段添加if/try时的操作)
如果想自定义表达式,则需要点击右侧的Edit Variables,添加表达式名称和具体实现,例如:

就可以在代码段中使用$CLASS_NAME$表示当前类的名称,$VALUE$表示当前类的对象。
更多表达式的定义可以参考官方文档
Postfix Completion
配置位置:Settings | Editor | General | Postfix Completion
配置页面上方加号,需要需要配置4个内容
- Key:编码缩写。示例:ce
- Minium Language level:最低支持的版本,视情况选,我个人配置的是jdk8。
- Applicable expression types:可以在哪些表达式后被联想,比如boolean,number,array等,图方便可以填空
- Target expression:代码段。示例:CollectionUtils.isEmpty($EXPR$),这里的EXPR表示"."之前的表达式。
图示:

个人配置分享
Live Templates
rn
return null;
cg
stream().collect(Collectors.groupingBy($END$));
ctm
stream().collect(Collectors.toMap($END$, Function.identity(), (a, b) -> a));
prsf
private final static String $varName$ = "$var$";
thrb
throw new BizException(BizErrorCode$END$)
qw
QueryWrapper<$PARAM$> queryWrapper = new QueryWrapper<>();
Postfix Completion
ce
CollectionUtils.isEmpty($EXPR$)
ceif
if (CollectionUtils.isEmpty($EXPR$)) {
$END$
}
cne
CollectionUtils.isNotEmpty($EXPR$)
cneif
if (CollectionUtils.isNotEmpty($EXPR$)) {
$END$
}
lqc
new LambdaQueryChainWrapper<>($EXPR$).
va
VerifyUtil.assertThat($EXPR$, BizErrorCode.$END$);
展开:
这个va是我日常用的最多的一个缩写,其实就是基于全局异常捕获的一个小trick
// 错误码接口
public interface BaseErrorInfoInterface {
/**
* 错误码
* @return
*/
Integer getResultCode();
/**
* 错误描述
* @return
*/
String getResultMsg();
}
// 错误码枚举
public enum BizErrorCode implements BaseErrorInfoInterface {
XXX_ERROR(1000, "XXX业务异常"),
;
private final Integer resultCode;
private final String resultMsg;
BizErrorCode(Integer resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
@Override
public Integer getResultCode() {
return resultCode;
}
@Override
public String getResultMsg() {
return resultMsg;
}
}
// 业务异常
public class BizException extends RuntimeException {
private static final long serialVersionUID = 1L;
protected Integer errorCode;
protected String errorMsg;
public BizException() {
super();
}
public BizException(BaseErrorInfoInterface errorInfoInterface) {
super(errorInfoInterface.getResultMsg());
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
}
// 全局异常捕获处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BizException.class)
public Result<Void> handleBizException(BizException e) {
LOGGER.error("method=handleBizException||errMsg=BizException:{}", e.getErrorMsg());
return Result.buildFailure(e);
}
}
// 校验类
public class VerifyUtil {
public static void assertThat(boolean condition, BaseErrorInfoInterface errorInfo) {
assertThat(condition, new BizException(errorInfo));
}
/**
* 业务流程中的校验
* @param condition 必须满足的条件
* @param bizException 否则抛出异常
*/
public static void assertThat(boolean condition, BizException bizException) {
if (!condition) {
throw bizException;
}
}
}

浙公网安备 33010602011771号