目錄
因為自己比較懶,尤其是對敲重復代碼比較厭惡,所以經常喜歡用快捷鍵和模板,Myeclipse的模板功能其實很強大,好像自己只用過syso這一個,所以最近學習了一下,初次寫博客,謝絕轉載。
一、Templates簡介
1.1 Templates基本介紹
Myeclipse模板的查看編輯入口,Window->Preferences->Java->Editor->Templates

點擊后右側會出現所有模板列表:

現對標紅位置簡單介紹:
- Name: 模板名稱,可以用來替換自定義代碼,以下簡稱熱字符串,即可以被替換的字符串。
- Context:作用域,只用在指定作用域下才能用來替換自定義代碼,本文章只討論Java相關模板。
- Auto Insert:自動插入,指當模板名稱唯一不會引起歧義的情況下,按代碼提示鍵(若無修改則為Alt+/),直接替換不需要選擇,為了快捷起見,盡量模板名稱要唯一,自動插入選擇上,可以方便輸入。
- New:這是本文章重點要使用的地方,即如何新建一個模板。
- Preview:這是模板的預覽。
- Use code formatter:模板可以看作是Java代碼,格式化方便查看。
1.2 Template基本語法
Java Template其實相對簡單,因為模板語法和Java語法一致,相對較難的只是對${}代表的標識符不熟悉,下面介紹所有標識符代表的含義。
可以把標識符簡單划分為屬性標識符,操作標識符和查找標識符三種(個人分類,方便理解)。
1.2.1 屬性標識符
屬性標識符表示該變量表示某一種固定屬性,有的隨熱字符串位置的變化而變化,有以下幾種。
|
屬性標識符
|
|
|
${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}的區別,如下圖所示

1.2.2 操作標識符
| 操作標識符 | |
| ${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}將被替換為當前選中的字符串。 |
1.2.3 查找標識符
查找標識符會查找指定范圍或類型的變量。在這之前簡單介紹一下查找標識符的通用用法。
- 使用變量:例如表達式${id:var}中id即為變量名(var代表距當前位置最近的可用變量),再次引用時即可使用${id}表示相同的內容,這樣做還有一個好處,那就是修改第一處后面同步修改,且按Tab鍵時不再定位相同的變量。
- 指定查找的類型:例如表達式${id:var(int)},用來查找int類型的變量,可以同時指定多個類型以逗號分隔如${id:var(int,double),位置靠前的優先被匹配,若可以同時查找到多個變量,則使用提示會顯示下拉列表供選擇。
- 查找變量時,只會查找當前可以訪問到的變量。
- 查找變量時,默認顯示距離熱字符串最近的一個匹配變量,若沒有查找到指定的變量則顯示大括號里面的內容,例如${var}查找不到,會顯示var。
- 當不指定查找類型時,可以不用變量名稱,若指定查找類型,則必須有變量名稱,若不指定類型則不能查找基本類型的變量。
| 查找標識符 | |
| ${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詳解
或許MyEclipse自帶的Templates不常用,但是通過分析這些Templates可以加深對標識符的理解,方便以后自己根據需求編寫Templates。下面簡單介紹幾個Template模板。
2.1 arrayadd,增加一個元素到數組中
2.1.1 template模板
${array_type}[] ${result:newName(array)} = new ${array_type}[${array}.length + 1]; System.arraycopy(${array}, 0, ${result}, 0, ${array}.length); ${result}[${array}.length]= ${var};
2.1.2 示例

2.1.3 詳解
根據最近一個數組,創建同類型的另一個數組,數組名稱具有相同風格,且長度比原數組多一位,然后將最近的一個變量賦值給最后一位。當前例子介紹了${array},${array_type},${result:newName(array)}的用法。
2.2 arraymerge 數組合並
2.2.1 template模板
${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);
2.2.2 例子

2.2.3 詳解
這個例子是合並兩個數組。當要獲得多個同類型的變量時,需要為每個變量起一個名字,例:${array},${array1:array},這樣才能依次取得多個變量。
2.3 do
2.3.1 template模板
do { ${line_selection}${cursor} } while (${condition:var(boolean)});
2.3.2 示例

2.3.3 詳解
所有帶${line_selection}的template,在選中一行或多行后,按快捷鍵Shift+Alt+Z將會被呼喚出來,選擇相應的template即可,template中的${line_selection}即表示為選中的行。
${cursor},代表回車后光標出現的位置。
2.4 for
2.4.1 template模板
for (${iteratorType:newType(java.util.Iterator)} ${iterator} = ${collection}.iterator(); ${iterator}.hasNext(); ) { ${type:elemType(collection)} ${name:newName(type)} = (${type}) ${iterator}.next(); ${cursor} }
2.4.2 示例

2.4.3 詳解
通過這個例子可以簡單學習下${collection},${iteratorType:newType(java.util.Iterator)}的用法,其中比較重要的就是自定義變量,${iterator},非系統類的即為自定義變量,默認顯示{}內的內容,可以進行修改,修改時,所有引用的地方同步修改。
2.5 main
2.5.1 template模板
public static void main(String[] args) { ${cursor} }
2.5.2 示例

2.5.3 詳解
這是另一種比較常用的做法,不使用任何template標識符,替換一段代碼,當有重復代碼時可以使用此做法。
2.6 static_final
2.6.1 template模板
${visibility:link('public ','protected ','','private ')}static final ${type:link(String,int)} ${NAME} = ${expr:link('""',0)};
2.6.2 示例

2.6.3 詳解
這就是一個典型的${link}用法,給出限定的幾個參數供方便用戶選擇
2.7 sysout
2.7.1 template模板
System.out.println(${word_selection}${});${cursor}
2.7.2 示例

2.7.3 詳解
這個應該是最常用的template,一般用戶輸入syso即可完成操作,原因是syso已經唯一匹配該template的名稱所以無需再進行選擇,因此template名稱的唯一性還是有助於代碼的快速替換的。很少有用戶按照標准操作使用sysout,一般用戶的行為都是在輸入syso得到System.out.println();后在括號里面放入當前代碼上面一行的變量,因此下面將對這個template進行優化。
${}代表一個占位符,這樣可以使Tab鍵定位到該位置用於輸入。
三、新建Template
MyEclipse內置的Template不能滿足需求的時候可以自己按需求建立。

- Name:temlate的名字,建議簡單,易記,唯一
- Context:作用域,Java-即Java全作用域,Java statements-即java方法內作用域,Java type members-即java方法外作用域
- Automatically insert:建議勾選,當符合要求時,自動插入,無需選擇。
- Insert Variable:相當於幫助文檔,里面有所有可用標識符的解釋和例子。
四、自定義Template
在大家都掌握template的基礎上,以下就只提供template模板和簡單介紹,例子不再給出,以下只是拋磚引玉,希望可以根據自己的需求制定出屬於自己的template。新建方式如下:
3.1 sysout 優化
3.1.1 Templates模板
System.out.println(${localVar});//${todo} need to delete
${cursor}
3.1.2 模板詳解
- 一般項目中輸出使用日志進行輸出,System.out.println()一般用於簡單的查看變量,需要被刪除,因此加上 //${todo} need to delete
- 增加焦點定位${cursor},這樣在輸入完成后即可按回車直接到下一行,簡化輸入
- 按常用習慣,默認輸出最近一個變量,${localVar},因基本類型無法匹配(我沒有找到匹配方法),所以可以編寫sysi代表打印出最近的int,sysd打印出最近的double
- 同樣其他template也可以進行優化,例如for的第二個,所以學會語法后就可以根據自己習慣進行優化。
3.2 ArrayList
3.2.1 Templates模板
${:import(java.util.List, java.util.ArrayList)} List<${String}> ${listName:newName(java.util.List)} =new ArrayList<${String}>(); ${cursor}
3.2.2 模板詳解
- 首先使用${:import(java.util.List, java.util.ArrayList)}判斷是否引用,可以減少一次快捷鍵使用,默認泛型是String,若修改后面的<>也會同步修改。
- 自動生成可用的變量名${listName:newName(java.util.List)},可以自己進行修改
- 可以定義該template名為alist,這樣簡單的輸入幾個字符通過快捷方式即可完成ArrayList創建。
3.3 HashMap
3.3.1 Templates模板
${:import(java.util.Map, java.util.HashMap)} Map<${String},${Object}> ${mapName:newName(java.util.Map)} =new HashMap<${String},${Object}>(); ${cursor}
3.3.2 模板詳解
默認鍵是String,自動引入Map和HashMap類,自動起名字
3.4 log
3.4.1 Templates模板
${:import(org.apache.log4j.Logger)}
private static final Logger logger = Logger.getLogger(${enclosing_type}.class);
3.4.2 模板詳解
自動引包,當前類名自動寫入
3.5 junit
3.5.1 Templates模板
${:import(org.junit.Test)}
@Test
public void test${newName}(){
try {
${cursor}
} catch (Exception e) {
e.printStackTrace();
}
}
3.5.2 模板詳解
這是一個簡單生成junit測試方法的template。
