Eclipse Template用法探讨.docx

上传人:b****6 文档编号:5190818 上传时间:2022-12-13 格式:DOCX 页数:14 大小:21.08KB
下载 相关 举报
Eclipse Template用法探讨.docx_第1页
第1页 / 共14页
Eclipse Template用法探讨.docx_第2页
第2页 / 共14页
Eclipse Template用法探讨.docx_第3页
第3页 / 共14页
Eclipse Template用法探讨.docx_第4页
第4页 / 共14页
Eclipse Template用法探讨.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Eclipse Template用法探讨.docx

《Eclipse Template用法探讨.docx》由会员分享,可在线阅读,更多相关《Eclipse Template用法探讨.docx(14页珍藏版)》请在冰豆网上搜索。

Eclipse Template用法探讨.docx

EclipseTemplate用法探讨

EclipseTemplate用法探讨

在编码的过程中,对代码重用的追求应该是我们的一个永恒的追求。

我们先从相同或相似的代码里提出公用方法,来方便我们的重用;而后,随着面向对象技术的提出,我们又提出父类或基类,在类的基础上对代码进行重用;后来,我们又有了模式这种层次的代码重用,虽然模式不仅仅是为了代码重用,但这也是一个目的;最后,我们又创建了各种框架或架构,来在更高层次的重用代码;展望未来,我们会在元数据、域领域的范围内进行代码的重用。

所有这一切,仍然还不能满足我们对代码重用的要求,我们还是会遇到各种各样的代码重用上的烦恼。

以下我来简单举出几个我们在编码过程中遇到的实际问题:

System.out.println(……);

这个方法是我们在Java编程的过程中经常会用到的,用得太频繁了,本来不是很长的方法调用,在我们使用频率过高后,就会觉得非常的麻烦。

为什么呢?

我们每次使用这个方法,所不同的只是println方法里面的参数,但每次不得不从System到println一个一个字母的敲。

与之相同的情况还有:

publicfinalstaticStringSEQUENCE_T_PRODUCT_HIST="T_PRODUCT_HIST";这是一个为常量赋值的语句,在我们的项目中,使用量也相当的大。

可能有人会说上面的语句比较简单,不能重用也是可以忍受的,而挖空心思去重用它们,反倒好像走了极端。

如果有人这么想,那么请看看下面的例子:

     try

           {

                    ……

           }

           catch(SQLExceptionEx)

           {

 

                    log.error(this.getClass(),"addUserRole",Ex,Ex.getMessage());

                    thrownewPersistenceException(Ex);

           }

      Catch(Exceptione)

      {

           ……

      }

比起上面的输出语句,这种对违例的扑捉更让人头疼,重复的代码更多,但又不能通过面向对象技术进行重用。

还有这样的例子,由于需要在程序中记录日志的原因,需要在每一个类的开头写下这样的语句:

publicclassICRMValidationFormTag……

{

privatefinalstaticLogger.ModuleMOD=newLogger.Module(ModuleId.MOD_TAG);

 

privatefinalstaticLoggerLOG=Logger.getLogger(ICRMValidationFormTag.class,MOD);

 

privatefinalstaticPerformanceLoggerPLOG=PerformanceLogger.getLogger(ICRMValidationFormTag.class);

……

}

等等。

这样的例子很多,我们在代码中可以信手拈来。

很多的情况,我们将会在后面的示例中看到。

从上面的例子可以看出,有这样一些的代码,有重用的需求,但我们却很难在语言的基础上、或面向对象技术、或模式、框架的基础上进行代码的重用。

可能的原因主要有以下几个方面:

第一是语言规范方面的原因,如print方法的调用和定义静态常量;第二是由于语言上的一些过程语句,如try…catch语句和case语句;第三可能是具体项目的一些性能或业务等方面的一些考虑。

对于这样的一些代码的重用方面的要求,Eclipse的模板给我们带来了一个很好的解决方案。

本文和后续的一些文字将探讨这方面的问题,希望引起大家对使用这一工具的兴趣。

在我看来,实际的项目中,关于Eclipse模板的使用应该是大有用武之地,而且也相当的灵活,能解决很多的实际问题。

本文将探讨Eclipse模板的使用和自定义模板的一些初步知识;而后续的文字会接着探讨一些自定义模板的深入使用。

一、Eclipse模板的使用

Eclipse模板的使用非常的简单:

在需要使用Eclipse模板的地方输入模板的名称,如println方法的模板名称为:

sysout。

如下:

然后点击启动模板的快捷键,如我的Eclipse上为Alt+/。

则出现如下的结果:

 

是不是很简单?

大家如果觉得sysout模板并没有给我们省多少功夫,那么可以尝试看看main函数,这也是我们经常要使用的一个方法。

整个方法如下:

publicstaticvoidmain(String[]args)

{

      

}

对于这个函数,一个字母一个字母的输入,大家是不是觉得相当的乏味。

Eclipse也为这个函数准备了一个模板,模板名称为main。

现在请我们在适当的位置输入main,然后点击Alt+/,Eclipse会下拉一些选择,我们选择“main-mainmethod”这个选择,大家就会看到我们想要的代码就会出现在相应的位置上。

 

二、更改快捷键

上面我将Eclipse模板的使用简单的描述了一遍,可能有人在点击Alt+/的时候,并没有得到想要的结果。

不用着急,这是您的Eclipse对模板快捷键的设置不同的原因,而我们可以修改模板快捷键。

下面我们来看看如何更改模板快捷键:

1.  点击Window/Perferences,如下

 

2.  在Perferences窗口里选择Workbench,如下

 

3.  选择Workbench下的Keys,如下

 

4.  在Command栏里的Category选项选择“Edit”,Name选项选择“contentassist”,如下

 

5.  在Assignments栏里选择Ctrl+Space那一行(因为Ctrl+Space被Windows系统占用,所以我们无法使用模板的这个快捷键),在KeySequence栏里将Ctrl+Space删掉,输入Alt+L,如下

 

6.  点击“Add”按钮,则在Assignments栏里增加一行,如下

 

7.  最后点击“Apply”按钮和“OK”按钮,完成更改模板快捷键的整个过程。

完成了上面的过程,我们就可以使用Alt+L作为Eclipse模板的启动快捷键了。

 

三、如何自定义Eclipse模板

一旦我们学会了使用Eclipse模板,我们很快就会发现Eclipse自带的模板远远不够我们使用,这时候,我们就需要自定义模板,来适应我们具体项目的实际需求。

那么,如何自定义Eclipse模板呢?

1.  点击Window/Perferences,如下

 

2.  在Perferences窗口里选择Java/Edit/Template,如下:

 

3.  然后点击“New”按钮,出现“NewTemplate”窗口,如下

 

4.  在“NewTemplate”窗口的Name栏里输入你自定义模板的名称,如“test”;在Content栏里选择java(java表示这个模板的内容是java代码,如果选择javadoc的话,表示这个模板的内容是注释);在Description栏里输入你的自定义模板的描述,如“justforatest!

ha”;最后是模板的java代码,如“System.out.println(“justforatest!

ha”);”。

如下

 

5.  最后不要忘了点击“OK”按钮,关闭两个窗口,我们的自定义模板就完成了。

现在,我们可以测试我们的test模板了,赶快试试吧!

 

四、几个自定义Eclipse模板的示例

最后来谈谈怎么创建模板,试着举几个简单的例子来作说明。

1.  简单的Eclipse模板的创建

直接将需要作为模板的语句填写在模板的Pattern栏里,如前面的publicfinalstaticStringSEQUENCE_T_PRODUCT_HIST="T_PRODUCT_HIST";这样的常量的定义。

我们可以定义一个strConstant的模板,将该模板的Pattern写为:

“publicfinalstaticString${cursor};”。

其中${cursor}的意思是光标所在的位置。

这样,你如果在程序的适当位置输入:

strConstant,然后点击Atl+/,那么你将得到如下的结果:

publicfinalstaticString(光标所在位置);

 

在实际的项目中,我们会遇到这样的情况:

if(LOG.isDebugEnabled()){

   LOG.debug(METHOD_NAME,"Theuser:

"+user.getName);

}

我们为了性能的考虑,经常希望在日志被关闭以后,不再执行LOG.debug方法里面的任何操作,如"Theuser:

"+user.getName这样的语句。

所以我们在LOG.debug方法外面加上LOG.isDebugEnabled()这样的判断语句。

加上了判断语句以后,代码的性能得到了提高,但每一个日志都加上:

if(LOG.isDebugEnabled()){

       

}

却带来了代码重用上的困难。

如今使用Eclipse模板正好解决了这个问题。

我们来创建一个enabledLOG的模板,它的Pattern为:

if(LOG.isDebugEnabled()){

   LOG.debug(METHOD_NAME,"${cursor}");

}

 

还有一个例子,我们在写自定义标签的时候,经常需要编码的是doEndTag方法,在这个方法里面,我们要先写日志:

finalStringMETHOD_NAME="doEndTag";

   PLOG.info(METHOD_NAME,PerformanceLogger.Event.METHOD_ENTRY);

然后将我们的代码用try…catch包括起来,如下:

try{

       ……

   }catch(Exceptione){

       LOG.error(METHOD_NAME,"……",e);

   }

省略号都是我们要写的代码。

最后,我们又需要纪录日志,然后返回,如下:

PLOG.info(METHOD_NAME,PerformanceLogger.Event.METHOD_EXIT);

   returnSKIP_BODY;

每一个自定义标签的格式都是如此,因此,我们可以创建一个doEndTag的模板,它的Pattern为:

publicintdoEndTag()throwsJspException{

   finalStringMETHOD_NAME="doEndTag";

   PLOG.info(METHOD_NAME,PerformanceLogger.Event.METHOD_ENTRY);

   try{

       ${cursor}

   }catch(Exceptione){

       LOG.error(METHOD_NAME,"",e);

   }

   PLOG.info(METHOD_NAME,PerformanceLogger.Event.METHOD_EXIT);

   returnSKIP_BODY;

}

 

在实际的编码过程中,我们会遇到很多这样的例子,使用Eclipse模板,将会把我们从烦躁而易于出错的拷贝粘贴中解放出来。

 

2.  带参数的Eclipse模板

Eclipse除了能让我们创建简单的、静态的Eclipse模板以外,还可以让我们创建动态的模板,这就是带参数的模板。

请看下面的例子:

privatestaticfinalStringEMPLOYEE_SQL="SELECT*FROMEMPLOYEE";

 

protectedStringgetEMPLOYEE_SQL(){

   returnEMPLOYEE_SQL;

}

 

privatestaticfinalStringDEPART_SQL="SELECT*FROMDEPARTMENT";

 

protectedStringgetDEPART_SQL(){

   returnDEPART_SQL;

}

这是我在实际项目中遇到过的代码,这两个相似的代码,除了常量的值不同以外,还有常量名不同,get方法不同,但get方法都是“get+常量名”的组合。

对于这样的模板,我们就需要引入带参数的Eclipse模板。

具体方法如下:

我们创建一个名为sqlConstant的模板,它的Pattern如下:

privatestaticfinalString${name}="";

 

protectedStringget${name}(){

   return${name};

}

其中的${name}就是我们的模板参数,当我们在程序的适当位置输入sqlConstant,然后点击Alt+/的时候,出现如下的效果:

这种参数的好处是,我们有三个地方为name,当我们在一个地方修改name为EMPLOYEE_SQL的时候,其他的两个地方的name同时改为EMPLOYEE_SQL。

我们看,这样的带参数的模板是不是很好用。

我们再来看一个例子:

假设我们有这样的代码,

protectedstaticIEmployeeBSVgetEmployeeBSV()

{

   IBusinessServiceManagerbsvmgr=GenericContainer.getInstance().getBusinessServiceManager();

   return(IEmployeeBSV)bsvmgr.getBusinessService(IEmployeeBSV.class);

}

 

protectedstaticIDepartmentBSVgetDepartmentBSV()

{

   IBusinessServiceManagerbsvmgr=GenericContainer.getInstance().getBusinessServiceManager();

   return(IDepartmentBSV)bsvmgr.getBusinessService(IDepartment.class);

}

我们就可以创建一个名为bsv的模板,其Pattern如下:

protectedstaticI${enclosing_method}get${enclosing_method}()

{

   IBusinessServiceManagerbsvmgr=GenericContainer.getInstance().getBusinessServiceManager();

   return(I${enclosing_method})bsvmgr.getBusinessService(I${enclosing_method}.class);

}

 

从上面的例子可以看出,给Eclipse模板带上参数以后,对Eclipse模板的使用就更加的灵活了。

这样,我们就可以更加灵活的创建Eclipse模板,更加灵活的使用Eclipse模板了。

 

3.  Eclipse模板的几个特殊参数

我们可以引用${enclosing_type}参数来代表使用模板的代码所在的类的类名。

假如我们有如下的代码:

publicclassICRMValidationFormTag

{

       privatefinalstaticLogger.ModuleMOD=newLogger.Module(ModuleId.MOD_TAG);

 

privatefinalstaticLoggerLOG=Logger.getLogger(ICRMValidationFormTag.class,MOD);

 

privatefinalstaticPerformanceLoggerPLOG=PerformanceLogger.getLogger(ICRMValidationFormTag.class);

……

}

 

publicclassEmployee

{

privatefinalstaticLogger.ModuleMOD=newLogger.Module(ModuleId.MOD_TAG);

 

privatefinalstaticLoggerLOG=Logger.getLogger(Employee.class,MOD);

 

privatefinalstaticPerformanceLoggerPLOG=PerformanceLogger.getLogger(Employee.class);

……

}

 

我们可以将每个类的前面三行作为一个模板,名为myLog模板,Pattern为:

privatefinalstaticLogger.ModuleMOD=newLogger.Module(ModuleId.MOD_TAG);

 

privatefinalstaticLoggerLOG=Logger.getLogger(${enclosing_type}.class,MOD);

 

privatefinalstaticPerformanceLoggerPLOG=PerformanceLogger.getLogger

 

(${enclosing_type}.class);

 

这样,如果我们在ICRMValidationFormTag类里引用myLog模板,如下:

publicclassICRMValidationFormTag

{

       myLog

}

则模板中凡是${enclosing_type}的地方,都将被ICRMValidationFormTag代替。

如果我们在Employee类中引用该模板,如下:

publicclassEmployee

{

       myLog

}

则模板中凡是${enclosing_type}的地方,都将被Employee代替。

 

同理,我们可以使用${enclosing_method}参数来代替使用模板的代码所在方法的方法名,如,如果我们想用模板来代替每一个方法里形如finalStringMETHOD_NAME="getEmployee";的语句,我们可以使用这样的模板:

模板名为methodName,Pattern为:

finalStringMETHOD_NAME="${enclosing_method}";

这样,如果你在getEmployee方法里使用该模板,那么结果为:

finalStringMETHOD_NAME="getEmployee";

如果你在saveEmployee方法里使用该模板,那么结果为:

finalStringMETHOD_NAME="saveEmployee";

其他的几个常用的特殊参数有:

enclosing_method_arguments—返回该参数所在方法的参数类型;encloging_package—返回该参数所在类的包名;enclosing_project—返回该参数所在的项目名;enclosing_type—返回该参数所在类的类名等等。

 

最后,我们以一个完整一点的例子作为本文的结束语。

在Spring的持久层,大家可能都写过这样的代码:

1.  Get方法

publicObjOwnedRolePrivilegeModelgetRolePrivilegeById(intid)throwsException

       {      

                finalObjOwnedRolePrivilegeModeloorp=newObjOwnedRolePrivilegeModel();

                try

                {

                          JdbcTemplatetemplate=newJdbcTemplate(dataSource);

                          Stringsql="selectID,ROLE_ID,OBJ_PRIV_ID,DESCRIPTIONfromt_obj_priv_rolewhereID="+id;

                

                          log.info(this.getClass(),"getRolePrivilegeById","SQL:

"+sql);

                          template.query(sql,newRowCallbackHandler()

                          {

                                   publicvoidprocessRow(ResultSetrs)throwsSQLException

                                   {

                                            //ObjOwnedRolePrivilegeoorp=newObjOwnedRolePrivilege(rs.getInt

(1),rs.getInt

(2),rs.getInt(3),rs.getString(4));

                                            oorp.setId(rs.getInt

(1));

                                            oorp.setRoleId(rs.getInt

(2));

                                            oorp.setObjPrivId(rs.getInt(3));

                                            oorp.setDescription(rs.getString(4));

                                   }

                          });

                }

                catch(Exce

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1