用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;
        }
    }
}
posted @ 2023-11-03 18:11  FinnHao  阅读(138)  评论(0)    收藏  举报