目录
因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Myeclipse的模板功能其实很强大,好像自己只用过syso这一个,所以最近学习了一下,初次写博客,谢绝转载。
一、Templates简介Myeclipse模板的查看编辑入口,Window->Preferences->Java->Editor->Templates
点击后右侧会出现所有模板列表:
现对标红位置简单介绍:
Java Template其实相对简单,因为模板语法和Java语法一致,相对较难的只是对${}代表的标识符不熟悉,下面介绍所有标识符代表的含义。
可以把标识符简单划分为属性标识符,操作标识符和查找标识符三种(个人分类,方便理解)。
属性标识符表示该变量表示某一种固定属性,有的随热字符串位置的变化而变化,有以下几种。
属性标识符
|
|
${enclosing_method}
|
热字符串所在位置方法的方法名。 |
${enclosing_method_arguments}
|
热字符串所在位置方法的参数名,若有多个以逗号分割。 |
${enclosing_package}
|
热字符串所在位置的包名。 |
${enclosing_project}
|
热字符串所在位置的项目名。 |
${enclosing_type}
|
热字符串所在位置的类名。 |
${file}
|
热字符串所在的文件名 |
${return_type}
|
热字符串所在位置方法的返回类型 |
${primary_type_name}
|
热字符串所在的文件名不带后缀 |
${date}
|
当前日期,例:2016-7-10 |
${time}
|
当前时间,例:下午6:00:09 |
${dollar}
|
代表字符串 $ |
${user}
|
当前登录用户名 例:Administrator |
${year} | 当前年份 例:2014 |
${todo} | Todo的字符串样式,默认TODO |
其中几个标识符代表含义如下图所示。
注:${enclosing_type}和${primary_type_name}的区别,如下图所示
操作标识符 | |
${import} | 当该类没有被引用,则引用这个类,例:${:import(java.util.List, java.util.Collection)} |
${importStatic} | 当该类没有被静态引用,则静态引用这个类,${:importStatic(java.util.Collections.EMPTY_SET, ‘java.lang.System.*‘)} |
${cursor} | 光标位置:热字符串被替换成指定代码后,光标首次定位在第一个变量上,按Enter后光标即会定位在${cursor}处。 |
${line_selection} | 表示选中的行,选中行后按Shift+Alt+Z 选择指定Template进行操作,Template表达式中的${line_selection}将被替换为当前选择的行。 |
${word_selection} | 表示选中的带双引号的字符串,按提示键选择指定Template进行操作,Template表达式中的${word_selection}将被替换为当前选中的字符串。 |
查找标识符会查找指定范围或类型的变量。在这之前简单介绍一下查找标识符的通用用法。
查找标识符 | |
${var} | 匹配所有变量名称,包括成员变量,局部变量和参数。 |
${field} | 匹配成员变量名称 |
${localVar} | 匹配局部变量名称或参数名称 |
${array} | 匹配数组名称 |
${array_type} | ${array}匹配到数组的类型 |
${array_element} | 为匹配的数组起一个可用的变量名,需和${array}一同使用 |
${collection} | 匹配一个集合(实现java.util.Collection接口的集合) |
${iterable} | 匹配一个可遍历的元素,数组或者实现Iterate的对象 |
${iterable_type} | ${iterable}匹配到对象的元素类型,若有泛型,则显示泛型类型 |
${iterable_element} | 为${iterable}匹配到对象起一个可用的变量名 |
${index} | 一个可用的索引下表变量,一般用在循环体中 |
${elemType} | 获得一个数组或者实现Iterate对象的元素类型,例:${t:elemType(a)} elem = ${a:array} |
${newType} | 根据全路径名,获得类名,若没有引用则对其引用,例:${type:newType(java.util.Iterator)} |
${newName} | 取一个具有相同风格且可用的变量名,例:${index:newName(int)} |
${link} | 指定提示的内容,例:${kind:link(EMPTY_SET, EMPTY_LIST, ‘EMPTY_MAP.entrySet()‘)} |
${exception_variable_name} | 捕获异常的变量名 |
${argType} |
解析指定元素(template变量)的第n个泛型类型,若引用的变量不存在或者没有参数则解析为Object,n代表第几个泛型变量类型 例:${type:argType(vector,0)} ${first:var(type)} = ${vector:var(java.util.Vector)}.get(0);匹配最近一个Vector取第0个对象 |
或许MyEclipse自带的Templates不常用,但是通过分析这些Templates可以加深对标识符的理解,方便以后自己根据需求编写Templates。下面简单介绍几个Template模板。
${array_type}[] ${result:newName(array)} = new ${array_type}[${array}.length + 1];
System.arraycopy(${array}, 0, ${result}, 0, ${array}.length);
${result}[${array}.length]= ${var};
根据最近一个数组,创建同类型的另一个数组,数组名称具有相同风格,且长度比原数组多一位,然后将最近的一个变量赋值给最后一位。当前例子介绍了${array},${array_type},${result:newName(array)}的用法。
${array_type}[] ${result:newName(array1)} = new ${array_type}[${array1:array}.length + ${array}.length];
System.arraycopy(${array1}, 0, ${result}, 0, ${array1}.length);
System.arraycopy(${array}, 0, ${result}, ${array1}.length, ${array}.length);
这个例子是合并两个数组。当要获得多个同类型的变量时,需要为每个变量起一个名字,例:${array},${array1:array},这样才能依次取得多个变量。
do {
${line_selection}${cursor}
} while (${condition:var(boolean)});
所有带${line_selection}的template,在选中一行或多行后,按快捷键Shift+Alt+Z将会被呼唤出来,选择相应的template即可,template中的${line_selection}即表示为选中的行。
${cursor},代表回车后光标出现的位置。
for (${iteratorType:newType(java.util.Iterator)} ${iterator} = ${collection}.iterator(); ${iterator}.hasNext(); ) {
${type:elemType(collection)} ${name:newName(type)} = (${type}) ${iterator}.next();
${cursor}
}
通过这个例子可以简单学习下${collection},${iteratorType:newType(java.util.Iterator)}的用法,其中比较重要的就是自定义变量,${iterator},非系统类的即为自定义变量,默认显示{}内的内容,可以进行修改,修改时,所有引用的地方同步修改。
public static void main(String[] args) {
${cursor}
}
这是另一种比较常用的做法,不使用任何template标识符,替换一段代码,当有重复代码时可以使用此做法。
${visibility:link(‘public ‘,‘protected ‘,‘‘,‘private ‘)}static final ${type:link(String,int)} ${NAME} = ${expr:link(‘""‘,0)};
这就是一个典型的${link}用法,给出限定的几个参数供方便用户选择
System.out.println(${word_selection}${});${cursor}
这个应该是最常用的template,一般用户输入syso即可完成操作,原因是syso已经唯一匹配该template的名称所以无需再进行选择,因此template名称的唯一性还是有助于代码的快速替换的。很少有用户按照标准操作使用sysout,一般用户的行为都是在输入syso得到System.out.println();后在括号里面放入当前代码上面一行的变量,因此下面将对这个template进行优化。
${}代表一个占位符,这样可以使Tab键定位到该位置用于输入。
三、新建TemplateMyEclipse内置的Template不能满足需求的时候可以自己按需求建立。
在大家都掌握template的基础上,以下就只提供template模板和简单介绍,例子不再给出,以下只是抛砖引玉,希望可以根据自己的需求制定出属于自己的template。新建方式如下:
System.out.println(${localVar});//${todo} need to delete
${cursor}
${:import(java.util.List, java.util.ArrayList)}
List<${String}> ${listName:newName(java.util.List)} =new ArrayList<${String}>();
${cursor}
${:import(java.util.Map, java.util.HashMap)}
Map<${String},${Object}> ${mapName:newName(java.util.Map)} =new HashMap<${String},${Object}>();
${cursor}
默认键是String,自动引入Map和HashMap类,自动起名字
${:import(org.apache.log4j.Logger)} private static final Logger logger = Logger.getLogger(${enclosing_type}.class);
自动引包,当前类名自动写入
${:import(org.junit.Test)} @Test public void test${newName}(){ try { ${cursor} } catch (Exception e) { e.printStackTrace(); } }
这是一个简单生成junit测试方法的template。
Myeclipse Templates详解(一) —— Java模板基础