Live Templates 是什么,听上去感觉挺玄乎的。有的同学用过之后觉得简直太好用了,不能说大大提高了开发效率吧,至少也是小小的提高一下,节省了很多敲重复代码的时间。有的同学用过之后说:没什么用,奇技淫巧罢了。
就算你没听过这个概念,但是或多或少你可能都用到过一点,就算没有用过的话,也可能见到过一些,没吃过猪肉可能也见过猪跑,就像下面这样的操作。
总结一下呢,它就类似于一种快捷指令(神奇代码),只要你在 IDEA 中输入特定的字母组合,IDEA 就会帮你在当前输入的位置插入一段预先定义好的代码,代码可以是固定的,也可以定义一些上下文变量,适用于那些常用的、使用频率较高的声明或重复代码段。
比如声明静态 final
的 String
,在不用 Live Tmeplates 的情况下,我们会手动在 IDEA 中依次敲出 "public static final String" 这一行代码,当然可能借助 IDEA 的只能提示,每个单词只需要敲前两个字母。在使用了 Live Tmeplates 的情况下, 我们只需要敲出 psfs
这四个字母,然后按回车键,IDEA 就会帮我们在 psfs
这个位置插入 "public static final String" 这一行。
没用过的同学是不是赶紧打开 IDEA 试一下呢?在设置界面,输入 Live Templates
,然后找到右侧的 Java
就可以看到内置的模板。不光有 Java 的,对于多种文件类型都有支持,比如 SQL 、JavaScript、JSP 、Kotlin 等。
下面介绍几个 IDEA 内置的、常用的模板。
main 和 psvm
main 方法插入,虽然我们已经可以很熟练的盲打出下面这一段代码,但是只敲四个字母是不是会更快呢。
public static void main(String[] args){
}
下面一些是常用的变量声明
psfs
public static final String
psfi
public static final int
prsf
private static final
St
String
下面是控制台输出,还有一些,不一一列举了。
sout
文本输出,最常用到的。
System.out.println();
souf
带格式化的文本输出。
System.out.printf();
fori
输入完,按回车后,光标会在 i<
的位置,等待输入临界值。
for (int i = 0; i < ; i++) {
}
iter
用 forEach 的方式循环,在一个数组或者列表变量下方使用。
List<String> array = new ArrayList<>();
for (String s1 : array) {
}
itco
用迭代器的方式迭代,同样是在一个列表变量下方使用。
List<String> array = new ArrayList<>();
for (Iterator<String> iterator = array.iterator(); iterator.hasNext(); ) {
String next = iterator.next();
}
这种模板是在选中一段代码后,然后使用快捷键 option
+command
+j
调出提示框,然后选择一个模板类型。
这个快捷键是 MAC 系统下的,如果你用的是 windows,可以通过点击 code
菜单项,找到 Sorround With
,看看快捷键是什么。
C
实现一个 Callable
Callable<Object> callable = new Callable<Object>() {
public Object call() throws Exception {
System.out.println("hello");
}
};
RL 和 WL
插入一段读锁或写锁加解锁代码。
// 要先声明一个读写锁实例
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock();
try {
System.out.println("hello");
} finally {
readWriteLock.readLock().unlock();
}
有时候我们经常会高频词的使用一段相似的代码, 比如做网络开发的同学,会经常用到 Socket 相关的初始化代码。
对于这种我们自己经常要写的某些类似的代码段,就可以抽取出一个 Template 出来,方便我们使用。
下面我就实现一个自定的 Template,来看一下是不是大大简化了重复性劳动。有的同学可能觉得无所谓的事儿,复制、粘贴也挺省事儿。见仁见智吧,觉得有用的可以尝试一下,觉得鸡肋的也无所谓,反正也不影响最后的功能实现。
比如我最新在做一些系统优化的工作,这个过程中,我会频繁的用 commons-lang3
的 StopWatch
来看某些方法或者某些代码段的执行时间。比如下面的代码段:
StopWatch stopWatch = new StopWatch("代码段");
stopWatch.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
stopWatch.stop();
System.out.printf("执行时间 %s%n",stopWatch.toString());
由于我比较懒,所以我不想每次都敲重复的内容,连粘贴复制都不想。所以就想到了 Live Template。
1、打开 IDEA 的设置窗口,找到 Editor 下的 Live Templates
,在右侧找到 Java
,点击最右侧的加号。
2、输入这个 Template 的名字,到时候可以在编辑器中通过输入这个名字来插入这个模板。
输入描述,帮助我们记忆。
最后输入模板的内容。
我给这个模板起名为 watch
,模板内容如下:
StopWatch stopWatch = new StopWatch("$MESSAGE$");
stopWatch.start();
$SELECTION$
stopWatch.stop();
System.out.printf("执行时间 %s%n",stopWatch.toString());
$SELECTION$
表示选中的部分,我们要监控的正好是某个方法或者某个代码段,所以正好可以用 Surround Templates,并且在内容中用了 $SELECTION$
,模板就默认为 Surround Templates了。
$MESSAGE$
就是一个占位符的作用,当我们插入这个模板后,光标会定位到这个占位符,我们就可以在需要定制的地方输入我们想要的内容了。在这里呢,由于我的一个方法中可能用到多个 StopWatch,所以正好在这儿占位,给不同的 StopWatch 赋予不同的名字。
可以通过下面的演示看一下效果。
有一些情况下,我们希望插入的内容不只是固定不变的代码段,而是希望加入一些上下文相关的内容,比如当前方法的入参,比如当前类名,比如当前方法名等。用下面这个例子说明一下。
有一个内置的模板叫做 soutm
,它的描述是这样的:Prints current class and method names to System.out,打印当前类和方法名,我们看一下效果,直接将当前类和方法名 Study.main
填充到了println
参数位置上。
模板内容是这样的,其中用到了两个变量是表示当前类名的 $CLASS_NAME$
和表示当前方法名的$METHOD_NAME$
。
System.out.println("$CLASS_NAME$.$METHOD_NAME$");
更多的可用变量可以到 IDEA 官网查看,看到这些变量后,可能会打开你的思路,更近一步的为你提高开发效率。不过不用这些变量也没关系,上面这写其实差不多也够用了。
官网地址:https://www.jetbrains.com/help/idea/template-variables.html#predefined_functions