简介

Eclipse 提供了通过定义和使用代码模板(Code Templates)来提高工作效率与代码可预测性的能力。本文介绍如何编辑现有的代码模板以及定义新的代码模板,并通过内置变量的示例,展示这些变量在编辑器中被解析后的实际内容。

背景与问题

在 Java 开发过程中,我们常面临以下问题:

  1. 缺乏一致性:当团队多人协作或个人遗忘特定编写规范时,代码风格容易出现差异,导致难以搜索和维护。
  2. 工作效率不高:编码工作涉及大量打字,手动键入或复制粘贴大段重复代码会消耗大量时间。

什么是代码模板

代码模板虽能提高效率,但不能替代真正的代码重用(如编写通用方法或函数)。在使用模板之前,提高一致性和效率的常用手动方法是复制粘贴并修改。而使用 Eclipse 中的模板功能可解决上述问题,只需编写一次模板,即可在整个应用程序中重复应用。

调用模板

在编辑器中输入时,开始键入模板名称并使用 Ctrl + Space 调用代码完成功能,名称匹配的模板会出现在列表中(如图 1)。若再次按 Ctrl + Space,Eclipse 会循环遍历模板类型。插入模板可使用箭头键选择后按 Enter,也可鼠标双击模板名称。模板插入后,可用 Tab 键在变量间切换并键入变量值。

图 1. 从列表中选择模板

eclipse1.gif

编辑模板

通过选择 Window > Preferences 打开 Eclipse 偏好设置,转到 Java > Editor > Templates 查看现有模板。单击列表中的模板并单击 Edit 进行编辑,此时会出现 Edit Template 窗口(如图 2)。

图 2. 编辑模板

eclipse2.gif

Edit Template 窗口中各字段含义如下:

  • Name:模板的名称。
  • Context:模板的上下文。Eclipse 将模板的选择限定于对该上下文有效的那些模板(例如,编辑 XML 文件时不会出现 Java 语句模板)。
  • Automatically insert:若选中,Eclipse 在模板全部名称输入完毕且调用模板插入后(如按 Ctrl + Space)自动插入模板。
  • Description:描述模板,出现在下拉列表中,有助于识别模板(模板名称不需唯一)。
  • Pattern:作为模板插入的实际代码,包含需 Eclipse 解析的全部变量。

可编辑模板值,完成后单击 OK。编辑模板时若要插入内置变量,可单击 Insert Variable,更多变量信息可查阅 "Taking advantage of variables in templates"。

创建模板

单击 New 创建模板,根据“编辑模板”部分介绍编辑值,完成后单击 OK,新模板将出现在列表内,最后单击 OK 关闭偏好设置窗口。

利用模板内的变量

使用模板的挑战在于了解内置变量的解析内容。变量可自动插入如当前类型名称、光标位置等内容,使模板更动态,减少手动更改工作量。

清单 1. 面向日志声明的模板

${imp:import(java.util.logging.Logger)} 
private static Logger logger = Logger.getLogger(${enclosing_type}.class.getName());

清单 2. 在插入日志声明后的 Automobile 类

private static Logger logger = Logger.getLogger(Automobile.class.getName());

如清单 1 和 2 所示,类名称会自动解析,且 Logger 的导入声明会自动添加在类顶端。

表 1. Eclipse 针对 Java 模板的内置变量

变量名描述示例
cursor将编辑器的光标放在这个位置N/A
date插入当前日期Oct 20, 2009
dollar插入货币符号$
elemType尝试猜测具有给定 ID 的这个元素的类型MyType
enclosing_method插入模板被插入其中的那个方法的名称method()
enclosing_method_arguments为包围方法插入参数arg1, arg2
enclosing_package插入当前类的包名com.example.ui
enclosing_project插入包含所编辑的这个类的项目的名称myProject
enclosing_type插入正在编辑的类型(类)的名称MyType
exception_variable_name插入一个异常变量名称,进行最佳猜测e, ioe
file文件的简称MyType.java
import如果尚未导入,那么针对给定类型插入一个导入声明import com.example.ui.MyOtherType
importStatic与 import 相同,只不过是静态导入import static com.example.ui.MyOtherType.*
line_selection将选中的行插入到这里,对用模板包装行有用以选中行作为主体的 do、while 循环
primary_type_name没有扩展名的文件简称MyType
time插入当前的时间9:09:35 a.m.
todo注释中的 TODO 标记TODO
user当前用户的名字ngood
var解析为本地变量,如果不只一个,就提供一个列表myvar
word_selection插入当前选中的单词N/A
year将现在的年份插入到代码中2009

也可创建自己的变量,在模板插入后输入值,键入的值会在变量出现的所有位置替换。如清单 3 模板:

清单 3. 创建您自己的变量

public void test${my_variable}() { 
     String expected = "value"; ${my_object}.set${my_variable}(expected); 
     assertEquals("${message}", expected, ${my_object}.get${my_variable}); 
}

图 3. 自动插入值

eclipse3.gif

插入模板后,只需键入第一个值,其余自动替换,完成后按 Tab 移到下一个变量。

导出模板

为与他人共享模板,可将其导出到文件(XML 格式,含模板信息,可导入到 Eclipse 其他实例)。选中模板并单击 Export,Eclipse 提示保存位置,完成导出后单击 OK 关闭 Preferences 窗口。

导入模板

可从包含导出模板的文件中导入模板。单击 Import,Eclipse 提示要导入的文件,导入后单击 OK,新模板即可导入到编辑器中。

结束语

Eclipse 内的代码模板是提高工作效率和应用程序一致性的有效方式。可构建自己的代码模板,在代码内定义变量以自动插入相关内容,还可通过导出和导入模板共享。例如,每次写小测试类时输入 main 方法很繁琐,可利用代码模板解决(如配置"psvm 代码模板”)。

编辑面板中关键五项如下:

  • Name:名称,即以后可用的代码缩写。
  • Context:模板上下文,指定模板生效位置(Java 至少包含 Java type members、Java statements、Java、Java doc 等)。
  • 模板变量:Eclipse 预置了一些(如 ${cursor} 等),也可定义自己的变量。
  • Pattern:代码模板对应的模式,按期望格式输入。

还可利用代码模板给类添加注释等。软件工程中工具的高效使用能节省成本,应了解并发挥工具最大潜能。本文只对 Java 代码模板作了粗浅介绍,其在编写 HTML 代码时优势更大(如自定义"ul_list_menu"模板生成菜单代码)。

其他有用参考


说明:本文基于较早期的 Eclipse 版本编写(文中示例日期显示为 2009 年),部分菜单路径或变量行为在新版本 IDE 中可能略有差异,但核心模板机制基本保持一致。