幾個(gè)自定義Eclipse模板的示例
最后來談?wù)勗趺磩?chuàng)建模板,試著舉幾個(gè)簡單的例子來作說明。
1. 簡單的Eclipse模板的創(chuàng)建
直接將需要作為模板的語句填寫在模板的Pattern欄里,如前面的public final static String SEQUENCE_T_PRODUCT_HIST = "T_PRODUCT_HIST";這樣的常量的定義。我們可以定義一個(gè)strConstant的模板,將該模板的Pattern寫為:“public final static String ${cursor} ;”。其中${cursor}的意思是光標(biāo)所在的位置。
這樣,你如果在程序的適當(dāng)位置輸入:strConstant,然后點(diǎn)擊Atl /,那么你將得到如下的結(jié)果:
public final static String (光標(biāo)所在位置) ;
在實(shí)際的項(xiàng)目中,我們會(huì)遇到這樣的情況:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "The user : " user.getName);
}
我們?yōu)榱诵阅艿目紤],經(jīng)常希望在日志被關(guān)閉以后,不再執(zhí)行LOG.debug方法里面的任何操作,如"The user : " user.getName這樣的語句。所以我們在LOG.debug方法外面加上LOG.isDebugEnabled()這樣的判斷語句。加上了判斷語句以后,代碼的性能得到了提高,但每一個(gè)日志都加上:
if (LOG.isDebugEnabled()) {
}
卻帶來了代碼重用上的困難。如今使用Eclipse模板正好解決了這個(gè)問題。
我們來創(chuàng)建一個(gè)enabledLOG的模板,它的Pattern為:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "${cursor}");
}
還有一個(gè)例子,我們在寫自定義標(biāo)簽的時(shí)候,經(jīng)常需要編碼的是doEndTag方法,在這個(gè)方法里面,我們要先寫日志:
final String METHOD_NAME = "doEndTag";
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_ENTRY);
然后將我們的代碼用try…catch包括起來,如下:
try {
……
} catch (Exception e) {
LOG.error(METHOD_NAME, "……", e);
}
省略號(hào)都是我們要寫的代碼。
最后,我們又需要紀(jì)錄日志,然后返回,如下:
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_EXIT);
return SKIP_BODY;
每一個(gè)自定義標(biāo)簽的格式都是如此,因此,我們可以創(chuàng)建一個(gè)doEndTag的模板,它的Pattern為:
public int doEndTag() throws JspException {
final String METHOD_NAME = "doEndTag";
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_ENTRY);
try {
${cursor}
} catch (Exception e) {
LOG.error(METHOD_NAME, "", e);
}
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_EXIT);
return SKIP_BODY;
}
在實(shí)際的編碼過程中,我們會(huì)遇到很多這樣的例子,使用Eclipse模板,將會(huì)把我們從煩躁而易于出錯(cuò)的拷貝粘貼中解放出來。
2. 帶參數(shù)的Eclipse模板
Eclipse除了能讓我們創(chuàng)建簡單的、靜態(tài)的Eclipse模板以外,還可以讓我們創(chuàng)建動(dòng)態(tài)的模板,這就是帶參數(shù)的模板。請看下面的例子:
private static final String EMPLOYEE_SQL = "SELECT * FROM EMPLOYEE";
protected String getEMPLOYEE_SQL () {
return EMPLOYEE_SQL;
}
private static final String DEPART_SQL = "SELECT * FROM DEPARTMENT";
protected String getDEPART_SQL () {
return DEPART_SQL;
}
這是我在實(shí)際項(xiàng)目中遇到過的代碼,這兩個(gè)相似的代碼,除了常量的值不同以外,還有常量名不同,get方法不同,但get方法都是“get 常量名”的組合。對(duì)于這樣的模板,我們就需要引入帶參數(shù)的Eclipse模板。具體方法如下:
我們創(chuàng)建一個(gè)名為sqlConstant的模板,它的Pattern如下:
private static final String ${name} = "";
protected String get${name}() {
return ${name};
}
其中的${name}就是我們的模板參數(shù),當(dāng)我們在程序的適當(dāng)位置輸入sqlConstant,然后點(diǎn)擊Alt /的時(shí)候,出現(xiàn)如下的效果:
![]() 這種參數(shù)的好處是,我們有三個(gè)地方為name,當(dāng)我們在一個(gè)地方修改name為EMPLOYEE_SQL的時(shí)候,其他的兩個(gè)地方的name同時(shí)改為EMPLOYEE_SQL。
我們看,這樣的帶參數(shù)的模板是不是很好用。
我們再來看一個(gè)例子:
假設(shè)我們有這樣的代碼,
protected static IEmployeeBSV getEmployeeBSV()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (IEmployeeBSV) bsvmgr.getBusinessService(IEmployeeBSV.class);
}
protected static IDepartmentBSV getDepartmentBSV()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (IDepartmentBSV) bsvmgr.getBusinessService(IDepartment.class);
}
我們就可以創(chuàng)建一個(gè)名為bsv的模板,其Pattern如下:
protected static I${enclosing_method} get${enclosing_method}()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (I${enclosing_method}) bsvmgr.getBusinessService(I${enclosing_method}.class);
}
從上面的例子可以看出,給Eclipse模板帶上參數(shù)以后,對(duì)Eclipse模板的使用就更加的靈活了。這樣,我們就可以更加靈活的創(chuàng)建Eclipse模板,更加靈活的使用Eclipse模板了。
3. Eclipse模板的幾個(gè)特殊參數(shù)
我們可以引用${enclosing_type}參數(shù)來代表使用模板的代碼所在的類的類名。假如我們有如下的代碼:
public class ICRMValidationFormTag
{
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(ICRMValidationFormTag.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger(ICRMValidationFormTag.class);
……
}
public class Employee
{
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(Employee.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger(Employee.class);
……
}
我們可以將每個(gè)類的前面三行作為一個(gè)模板,名為myLog模板,Pattern為:
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(${enclosing_type}.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger
(${enclosing_type}.class);
這樣,如果我們在ICRMValidationFormTag類里引用myLog模板,如下:
public class ICRMValidationFormTag
{
myLog
}
則模板中凡是${enclosing_type}的地方,都將被ICRMValidationFormTag代替。
如果我們在Employee類中引用該模板,如下:
public class Employee
{
myLog
}
則模板中凡是${enclosing_type}的地方,都將被Employee代替。
同理,我們可以使用${enclosing_method}參數(shù)來代替使用模板的代碼所在方法的方法名,如,如果我們想用模板來代替每一個(gè)方法里形如final String METHOD_NAME = "getEmployee";的語句,我們可以使用這樣的模板:
模板名為methodName,Pattern為:
final String METHOD_NAME = "${enclosing_method}";
這樣,如果你在getEmployee方法里使用該模板,那么結(jié)果為:
final String METHOD_NAME = "getEmployee";
如果你在saveEmployee方法里使用該模板,那么結(jié)果為:
final String METHOD_NAME = "saveEmployee";
其他的幾個(gè)常用的特殊參數(shù)有:enclosing_method_arguments—返回該參數(shù)所在方法的參數(shù)類型;encloging_package—返回該參數(shù)所在類的包名;enclosing_project—返回該參數(shù)所在的項(xiàng)目名;enclosing_type—返回該參數(shù)所在類的類名等等。
|
|