IntelliJ IDEA快速入门 | 第二十九篇:你应该知道的那些常用模板

简单了解一下IntelliJ IDEA中的模板

讲完快捷键以后,咱们接着往下讲,那讲什么呢?讲模板,模板的英文是Templates,那它是什么意思呢?模板的意思是我们可以配置一些常用的代码字母的缩写,在输入简写的时候就可以出现咱们预定义的固定模式的代码,从而就能提高咱们的开发效率了,另外的话,咱们作为程序员还可以在IntelliJ IDEA当中去做一些个性化的定制,使得模板变得更加的丰富一些。

其实说到模板,大家感觉好像有点陌生,但实际上你并不会觉得陌生,我这样说是有道理的。不妨我举个例子来给大家说一下吧,不妨回想一下,如果你之前使用过Eclipse的话,那么你应该很清楚在Eclipse当中要想写个main方法进行测试,通常就是写个main这样的字母组合形式的东东然后一回车就完了,这时就会出现下面这样的一个主函数。

public static void main(String[] args) {}

没错,就是通过main这样的几个字符调出来了以上主函数。其实,现在我们要说的模板就跟这个main一样,通过几个常用代码字母缩写就能调出来预定义的固定模式的一段代码。

那问题来了,模板在哪呢?其实IntelliJ IDEA已经给我们预定义了一些模板,大家可以进入IntelliJ IDEA的设置界面中,然后展开Editor这一项,这时你会看到Live Templates,翻译过来就是时时代码模板。

在这里插入图片描述

在以上Editor > Live Templates界面中,你就能看到我们可以使用的一些模板了。那我们常用的一些在哪呢?看到Java它了没,展开它,你就能看到我们比较常用的一些模板了,例如foripsvm以及sout等等。

在这里插入图片描述

注意,还有一个位置也有一些我们比较常用的模板。依次展开EditorGeneral这两项,这时你会看到Postfix Completion这样一个选项,如下图所示。

在这里插入图片描述

在以上Editor > General > Postfix Completion界面中,你是不是看到了一些模板了啊?尤其是在Java这一项下面,就有很多现成的模板可以供我们去使用。

这个时候你可能会问,为什么会在以上两个位置预定义一些模板呢?要不我先给大家简单说一下二者的区别吧,其实你也能从以上两个界面中看到它们二者之间的区别,什么意思呢?在Editor > Live Templates界面中,比如你选定了一个模板,如psvm,这时你实际上是可以对已经提供好的这个模板进行修改的,同时你还可以将其删除掉,或者再添加一个新的模板,也就是说,大家可以在这儿定制一些个性化的模板。

在这里插入图片描述

而在Editor > General > Postfix Completion界面中,你只能是去用这些现成的模板,而不可以去进行修改、删除或者是增加等操作了。它们二者之间的区别就是这样的,即一个能改,一个不能改。

其实,这两个位置提供的模板有一些是重叠的,比如说你要判断一个变量是否为null,那么你不仅可以使用Editor > General > Postfix Completion界面中的如下null模板。

在这里插入图片描述

还可以使用Editor > Live Templates界面中的如下ifn模板。

在这里插入图片描述

如果以上两个位置都对同一个操作提供了模板,那么我们该使用哪一个模板呢?如果大家使用的是Editor > General > Postfix Completion界面中提供的模板,那么速度相较会稍微的快一点,但是快的非常有限,也就0.01秒,大家可能也感觉不出来。

所以,我们就可以得出这样一个结论了,咱们不仅可以使用Editor > Live Templates界面中提供的模板,还可以使用Editor > General > Postfix Completion界面中提供的模板。

好,以上就说清楚了我们模板所处的位置。接下来,我就来给大家说一下常用的模板都有哪些,大家要记得这些常用的模板,因为这会极大地提高我们的开发效率。

那些常用的模板

我这里会新建一个类,例如TemplatesTest,来介绍一下咱们实际开发中那些常用的模板。

模板一:psvm

首先,我来给大家介绍第一个常用的模板,即psvm,你只要在类中写上这样几个字符然后一回车,就能调出来main方法了哟😀。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {}}

还记得我们之前在Eclipse当中要想调出main方法,使用的是哪几个字符吗?没错,使用的就是main这样的几个字符。

有心的同学,肯定发现了psvm这个模板其实就是publicstatic以及void这几个关键字和main方法的首字母组成的,仔细看,是不是这样的啊!现在该好记了吧😊!

模板二:sout

还记得你在刚入门Java时所写的第一个Hello World程序吗?是不是写了一个main方法,然后再在main方法里面写了一个输出语句输出Hello World啊?

还记得我们之前在Eclipse当中想要写一个输出语句,使用的是哪几个字符吗?没错,咱们习惯使用的是syso这样的几个字符。而在IntelliJ IDEA当中,我们使用的是sout模板,你只要写上这样几个字符然后一回车,就能调出如下输出语句了,这样,就能输出你想输出的内容了,例如"hello!"

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println(); // 此时光标停留在()内}}

其实,sout这个模板还有几个相应的变形(拓展),接下来,我们就来详细介绍一下它们。

变形一:soutp

soutp模板中的p我们可以理解成是单词parameter,即参数(形参)的意思。你只要写上soutp这样几个字符然后一回车,就会发现调出了如下这样一行输出语句。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));}}

可以看到就是打印了一下当前方法(例如main方法)的形参。有的时候,我们确实是有这样的需求的,即打印一下当前方法的形参,看看这个形参到底是什么样子的。这时我们就可以比较方便地使用soutp模板了,而不用通过sout模板先调出一个最普通的输出语句,再去打印该形参了。

变形二:soutm

soutm模板中的m,我想有的同学应该已经猜到了,它就是单词method的缩写。该模板能够帮我们把方法的名字给打印出来,如果你是在main方法中使用的该模板,那么调出来的就是下面这样一个输出语句。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");}}

当然了,如果你要是在其他方法中使用该模板,例如method方法,那么调出来的就是下面这样一个输出语句了。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");}public void method() {// 变形二:soutmSystem.out.println("TemplatesTest.method");}}

变形三:soutv

soutv模板中的v是什么呢?有的同学可能想得比较快,一下子就想到了是单词variable的缩写,即变量的意思。想必你也猜到了,该模板可以帮我们把某一变量的值给打印出来。

废话不多说,我用一个例子来演示一下,例如,这里我先定义了一个int型的num变量,并为其赋个了值,这时候只要你使用一下soutv模板,就能直接打印出num变量的值了。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");// 变形三:soutvint num = 10;System.out.println("num = " + num);}public void method() {// 变形二:soutmSystem.out.println("TemplatesTest.method");}}

soutv也是咱们在实际开发中做测试的时候经常用到的一个模板,测试一下,唉,这个变量它到目前为止是不是null啊,如果不是的话,那么它的结果到底是多少啊!你扪心自问一下,是不是要经常做这样的一个操作?

这时候,大家可能会有这样一个疑惑,如果我要是定义了两个变量,就像下面这样:

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");// 变形三:soutvint num = 10;int num1 = 20;// 此时,使用soutv模板,打印的是num变量的值,还是num1变量的值呢?}public void method() {// 变形二:soutmSystem.out.println("TemplatesTest.method");}}

此时,使用soutv模板,打印的是num变量的值,还是num1变量的值呢?你去试着使用一下soutv模板不就知道了吗?很显然,此时打印的是num1变量的值,为什么啊?因为就近原则呗,soutv模板会就近的去选择变量进行打印。

如果我就硬想打印num变量的值,那么该怎么办呢?很简单啊,切到该变量的下一行,使用一下soutv模板不就打印出该变量的值了吗?你不会傻到连这个都没想到吧😀,除此之外,我们还可以使用xxx.sout模板哟,接下来我们就来介绍一下它。

变形四:xxx.sout

还是先把问题摆出来,现在我定义了两个变量,就像下面这样:

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");// 变形三:soutvint num = 10;int num1 = 20;// 此时,我就想打印一下num变量的值,那么该怎么办呢?}public void method() {// 变形二:soutmSystem.out.println("TemplatesTest.method");}}

此时,我就想打印一下num变量的值,那么该怎么办呢?一共有两种解决方案,第一种解决方案就是老老实实的使用sout模板调出一个最普通的输出语句,然后再来打印num变量的值,但是感觉这种解决方案稍微有点慢,不是吗?而第二种解决方案就简单多了,直接写上num.sout然后一回车就完事了。

package com.meimeixia.bean;/*** @author liayun* @create 2021-04-01 15:50** 文档注释*/
public class TemplatesTest {// 模板一:psvmpublic static void main(String[] args) {// 模板二:soutSystem.out.println("hello!"); // 变形一:soutpSystem.out.println("args = " + Arrays.deepToString(args));// 变形二:soutmSystem.out.println("TemplatesTest.main");// 变形三:soutvint num = 10;int num1 = 20;// 此时,我就想打印一下num变量的值,那么该怎么办呢?// 变形四:xxx.soutSystem.out.println("num = " + num);}public void method() {// 变形二:soutmSystem.out.println("TemplatesTest.method");}}

模板三:fori

咱们在实际开发中经常会需要遍历数组或者集合,遍历的时候,你肯定是要用到循环的,此时fori模板就应运而生了,因为它就能生成for循环。

例如,有一个String型的数组,如下所示,对于这样一个String型的数组,相信大家都会遍历了。

String[] arr = new String[]{"Tom", "Jerry", "HanMeimei", "LiLei"};

现在,我们不妨使用一下fori模板,演示效果如下。

在这里插入图片描述

使用了该模板之后,遍历数组是不是就变得很方便了啊?

其实,fori模板对应也有2个变形,一个是iter,一个是itar,下面我们分别来介绍一下它们。

变形一:iter

iter模板实际上能帮我们生成一个增强for循环。

同样地,我们不妨使用iter模板来遍历一下以上String型的数组,演示效果如下。

在这里插入图片描述

可以看到fori模板帮我们生成的是一个普通的for循环,而iter模板却是帮我们生成了是一个增强for循环。

变形二:itar

itar模板实际上帮我们生成的还是一个普通的for循环,只不过它会给我们做一个赋值操作。

同样地,我们不妨使用itar模板来遍历一下以上String型的数组,演示效果如下。

在这里插入图片描述

如果大家写习惯了,那么你会发现就光这个输出语句本身,就有好几个变形,这是不是比用Eclipse要舒服多了啊,而且速度也快,包括写个循环也会变得方便很多。

模板四:list.for

集合有很多,不过这儿我们只讨论List集合,而且它还是有序的。在实际开发中,我们经常会需要遍历List集合,你可能就会想了,该如何更加方便快捷的遍历List集合呢?带着这个疑问你就往下看吧😀

例如,有一个ArrayList集合,如下所示,这里是以ArrayList为例来演示的。

ArrayList list = new ArrayList();
list.add(123);
list.add(345);
list.add(567);

温馨提示:这儿我没有去写泛型,没写就没写吧,也没事,反正咱们主要演示的是模板的使用。

为了更加方便快捷的遍历以上ArrayList集合,那我们就可以使用list.for这样一个模板了,效果如下。

在这里插入图片描述

可以看到该模板自动地帮我们生成了一个增强for循环的结构,而且由于我这里没有使用泛型,所以就默认每个元素都是Object类型的。

其实,list.for模板对应也有2个变形,一个是list.fori,一个是list.forr,下面我们分别来介绍一下它们。

变形一:list.fori

list.fori模板实际上能帮我们生成一个普通的for循环。

同样地,我们不妨使用list.fori模板来遍历一下以上ArrayList集合,演示效果如下。

在这里插入图片描述

变形二:list.forr

既然list.for模板帮我们生成的是一个增强for循环,list.fori模板帮我们生成的是一个普通for循环,那么list.forr帮我们生成的又是啥呢?还能有什么花样吗?

不妨这里我们还是使用list.forr模板来遍历一下以上ArrayList集合,看看效果。

在这里插入图片描述

可以看到list.forr模板也帮我们生成了一个普通的for循环,只不过它是一个逆序(倒序)的遍历。

知道了以上这些模板之后,对于我们遍历数组或者集合将会变得非常方便,不用我们自己再一点点去敲了,而是直接有现成的结构可以供我们去使用。

模板五:ifn

循环结构和条件判断是咱们在程序当中经常要来书写的,接下来,我们说一下这个条件判断。

假如有如下这样一个ArrayList集合,我想判断一下list这个引用类型的变量是否是一个null,那么该如何更加方便快捷做这样一个操作呢?

ArrayList list = new ArrayList();
list.add(123);
list.add(345);
list.add(567);

这时,你就可以使用ifn模板了,因为ifn就是if null的意思,写上ifn然后一回车,效果就是下面这样子的了。

在这里插入图片描述

使用该模板之后,想要判断某个东东是不是一个null,是不是还怪方便的啊?

其实,ifn模板对应也有3个变形,下面我们分别来一一介绍下它们。

变形一:inn

如果我们现在想要更加方便快捷地判断以上list引用类型的变量是否不是null,那么该怎么办呢?这时,你不妨使用一下inn模板,因为inn就是if not null的意思。

在这里插入图片描述
大家不妨进入IntelliJ IDEA的设置界面中去看一下,你就会发现ifninn这两个模板是Editor > Live Templates这儿提供的,如下图所示。

在这里插入图片描述

而接下来我们要介绍的两个模板,即xxx.nnxxx.null,是Editor > General > Postfix Completion这儿提供的,如下图所示。

在这里插入图片描述

可以看到,这儿我们是混到一起来讲了,并没有给它们去做特别的区分。

变形二:xxx.null

如果我们现在还想要更加方便快捷地判断以上list引用类型的变量是否是一个null,那么可以使用xxx.null模板哟😊,效果如下。

在这里插入图片描述

变形三:xxx.nn

如果我们现在还想要更加方便快捷地判断以上list引用类型的变量是否不是null,那么可以使用xxx.nn模板哟😊,效果如下。

在这里插入图片描述

大家发现没有,不管你是使用Editor > Live Templates这儿提供的模板也好,还是使用Editor > General > Postfix Completion这儿提供的模板也好,都是没有问题的,看你心情了,爱使用哪儿的就使用哪儿的。

模板六:prsf

prsf模板可以生成private static final这几个关键字哟😀。回想一下,我们在定义一个类的时候,是不是经常会给它定义一些属性啊!而有时候这些属性比较特别,是用private static final这几个关键字来修饰的,于是,它们就变成私有的静态的常量了。那我们什么时候定义过这种私有的静态的常量呢?好好回忆一下,是不是在写单例模式的时候,我们要把唯一的那个对象声明为private static final啊!

如果我们需要定义一个私有的静态的常量,那么现在还有必要一个一个手写private static final这几个关键字吗?显然没有必要,使用prsf模板即可。例如,我现在想定义一个私有的静态的Customer类型的常量,使用prsf模板的演示效果如下。

在这里插入图片描述

不知道你发现错误没有?大家可以看到以上Customer类是在Module01这个模块里面的,而现在我编写的TemplatesTest类是位于HelloLiayun这个工程下的,如下图所示。

在这里插入图片描述

这时,你会发现我们在TemplatesTest类中试图定义一个私有的静态的Customer类型的常量时,Customer类型不能够正确识别了,变成红色了,如下图所示。

在这里插入图片描述

难道是在工程下不能使用模块中的代码吗?用脑袋想想,肯定都不会是这样子的。既然这样,那怎么修正我们这个错误呢?笨蛋,用万能解错快捷键啊,即Alt + Enter。于是,我们先将光标放在Customer类型上,然后再按下Alt + Enter快捷键,这时就会弹出一个下拉列表了,如下图所示。

在这里插入图片描述

接着,选中Add dependency on module 'Module01'这一项之后回车即可,你可能会问,这是在干嘛啊?这是在添加Module01模块的依赖。此时,你会发现在HelloLiayun.iml这个文件里面增加了如下这样的一个依赖,而且TemplatesTest类中的Customer类型也能够被正确识别了。

在这里插入图片描述

问题就这样被解决了。如果你要是把HelloLiayun.iml文件里面新添加的这个依赖给删除了,那么你会发现TemplatesTest类依旧还是报Customer类型不能够被正确识别的错误。

<orderEntry type="module" module-name="Module01" />

其实,我这里要说的是,我们后续真正开始使用IntelliJ IDEA来开发项目的时候,遇到错误不要怕,先按一下Alt + Enter快捷键万能纠错下再说。

最后,跟prsf模板相似的还有几个,下面我们分别来一一介绍下它们。

psf模板

我们有时候在类中定义的变量的访问修饰符不再是private了,而是public的,这时再用prsf模板就不合适了,而用psf模板就会很合适,因为psf模板可以生成public static final这几个关键字。两相对比,很明显,prsf模板中的pr代表的是private,而psf模板中的p代表的是public。

例如,我现在想定义一个公共的静态的int类型的常量,使用psf模板的演示效果如下。

在这里插入图片描述

记住,像这种常量通常都是要写成大写的哟~

psfi模板

其实,想要定义一个公共的静态的int类型的常量,还可以使用psfi模板哟,如下所示。

在这里插入图片描述

psfs模板

psfs模板想必大家也猜出来了,它能够帮我们快速定义一个公共的静态的String类型的常量,即全局常量。

例如,我现在想定义一个公共的静态的String类型的常量,使用psfs模板的演示效果如下。

在这里插入图片描述

至此,我就以举例子的方式来为大家演示完了IntelliJ IDEA中的一些常用模板,这些模板不仅在Editor > Live Templates这儿有,而且在Editor > General > Postfix Completion这儿也有,大家不用刻意地去区分用的模板到底是哪儿的,这压根就没有必要,而是应该以实用为主,能够应用就可以了。

这里,我只列举出来了6组模板,大家能够熟练使用这6组模板就可以了,如果你嫌这些模板不够使,那么你就去以上那两个地方去看去用其他的模板就哦了,在此不再过多赘述。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平