Myeclipse Templates詳解(一) —— Java模板基礎


目錄

  因為自己比較懶,尤其是對敲重復代碼比較厭惡,所以經常喜歡用快捷鍵和模板,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 查找標識符 

  查找標識符會查找指定范圍或類型的變量。在這之前簡單介紹一下查找標識符的通用用法。

  1. 使用變量:例如表達式${id:var}中id即為變量名(var代表距當前位置最近的可用變量),再次引用時即可使用${id}表示相同的內容,這樣做還有一個好處,那就是修改第一處后面同步修改,且按Tab鍵時不再定位相同的變量。
  2. 指定查找的類型:例如表達式${id:var(int)},用來查找int類型的變量,可以同時指定多個類型以逗號分隔如${id:var(int,double),位置靠前的優先被匹配,若可以同時查找到多個變量,則使用提示會顯示下拉列表供選擇。
  3. 查找變量時,只會查找當前可以訪問到的變量。
  4. 查找變量時,默認顯示距離熱字符串最近的一個匹配變量,若沒有查找到指定的變量則顯示大括號里面的內容,例如${var}查找不到,會顯示var。
  5. 當不指定查找類型時,可以不用變量名稱,若指定查找類型,則必須有變量名稱若不指定類型則不能查找基本類型的變量
查找標識符
${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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM