引言
Eclipse是流行的Java集成开发环境(IDE)同时它还可以作为其它语言的开发环境(例如C++和Ruby)并且作为开发桌面或服务器应用程序的富客户端开发平台如今Eclipse开源社区拥有几十个开源项目其范围从商务智能到社会网络等各个方面Eclipse是非赢利性基金会的名字由它全面负责这些工程
Eclipse的每个版本在Eclipse的发行历史上都具有里程碑意义在年月日同时发行了共十个Eclipse工程本文将集中探讨Eclipse 版本的IDE特别是它的Java开发工具(JDT)
JDT构成
JDT的历史可以追蹤到在年用Smalltalk编写的Visual Age for Java(VAJ)在VAJ中一切都被编译并且全部被调入内存这种设计不能进行比例缩放难于扩展从而使其很难进行再创造
在年该IDE团队开始开发Visual Age Micro Edition(VAME)这个工具开始完全用Java编写并使用标准Widget工具箱(SWT)来实现其用户接口当时的VAME的主要设计市场针对的是嵌入式空间中的开发与应用为此它使用了标准Java虚拟机并且让工作区位于文件系统中然而文件和文件夹名字都是一些不能读的UUID
与VAJ提供的编译器相比VAME的增长式编译器快了将近十倍这种模型是基于状态构建的(与当前的Eclipse形成对照它是基于源码的)VAME有它自己的仓库系统Rapier并且可以使用插件方式来对之进行扩展
VAME一开始并没有吸引社区开发者的注意力但是其中的确包含很多好主意开发者以后使用之来开发了他们的下一代工程Eclipse在年Eclipse 发行当时它被描述为一种通用的IDE并不特别针对于什么内容从一开始Eclipse和JDT都被构建为一种针对其它开发工具使用的开发平台工作区存储在磁盘上并且对其它工作区开放Eclipse 中使用的不是一种专利式数据仓库而是集成了CVS
与其先行者相比Eclipse还有另一个重要区别它是开源的而且其用户社区大量存在并且是自维持性的Eclipse 大多数的新的和改进特征直接来源于Eclipse用户自从版本以来共有超过个请求被修改并得到增强去粗存精下面让我们来重点分析几个对于大多数Java开发者特别重要的特征
Eclipse编译器
JDT的强有力的特征之一是它的内植的完全兼容于javac的增长式Java编译器尽管你能使Eclipse使用Ant和javac甚至能够使问题标记显示于IDE中(这是版本中的新特征)但是Eclipse编译器本身就提供了更好的诊断技术
该JDT编译器最初的开发目的是针对VAME以后针对Eclipse作了修改这个编译器基于开发者称之的编译三规则并在模式上遵循了Asimov的机器人学规则
正确性一个编译器不能损害一个源程序
高效性除了与规则相沖突的地方之外一个编译器必须是快速的
友好性一个编译器必须帮助用户纠正编程错误只要这样的帮助不与规则和规则相沖突
正确性当设计一个Java编译器时你不仅必须遵循相应的规范而且还要领悟该规范的精神只考虑正确性是不行的因此JDT开发者一直在努力奋斗以与其它编译器基本保持一致(包括Sun的编译器)在Eclipse (相比之下在VAJ中根本没有进行单元测试)中仅针对正确性的检查就超过多次的单元测试
高效性成千的工程和成百万行的代码往往是很经常的事情这意味着大量的问题例如内存消耗必须能够被预测和加以分级需要解决Eclipse 使用回归式优化策略对此作了进一步提炼例如开发者可以重写一个流程图以便使用位操作结果它从以前百分之的时间消耗降低到了百分之
友好性报告错误是一种艺术只用行号是不够的二级错误被最小化例如如果你在一个文件中丢失了一个分号它不会影响所有另外它所依赖的文件改进的静态分析功能有助于发现错误模式另外Eclipse还能够对Javadoc进行正确性检查
在版本中Eclipse编译器是JavaSE兼容的Eclipse支持Java 分类和StackMapTable属性(甚至在Java 发行之前)而且该编译器提供了大量的新的诊断功能有助于你发现存在于代码中的问题与版本的编译器(提供了种诊断功能)相比VAJ则仅提供了种诊断功能最新的一些诊断功能包括针对如下内容的检测
· 使用显然是null的变量
· 不必要的null检查
· 到方法参数的偶然赋值
· 切换大小写
· 使用非泛型(原始)类型
· 未使用的标签
· 不必要的$NONNLS$标签
在默认情况下大多数的这些功能都处于off状态当然你还可以使用@SuppressWarnings注解来把它们设置为off状态
从版本开始如果你想在Eclipse外部使用Eclipse编译器你可以单独下载这样的版本它的命令行兼容于javac并且下载尺寸仅有MB左右既然Eclipse编译器是开源的所以大量的其它工程例如Apache Tomcat就可以绑定到其它的软件当中
编辑器
任何开发环境的最基本的特征首先体现在编辑器上一般地你会把大多数时间花在其中因此编辑器必须是舒适不唐突强有力的而且能够提供语法高亮显示JDT使用它的Java模型来提供语法高亮显示功能例如它十分清楚类与实例变量之间的区别因此它能以不同的颜色来标志它们它甚至能够窥探源码注释来指出是否你调用的一个方法是过时的(或不推荐使用)并且针对这一方法调用绘制一条线以强调这一部分代码值得注意
在Java编辑器中的一个有用的命令之一是Ctrl+Space(内容助理)不记得一个对象的方法有哪些或如何拼写一个类名吗?只要按下Ctrl+Space那么Eclipse将在任何给定点提供一个有效的可能性列表Eclipse 继续改进这个特征例如当你输入长标识符例如LongJavaName时现在你可以输入LJN并且按下Ctrl+Space那么Eclipse就会知道你的意思这称作CamelCase completion当进行类型查找时它也能工作(Ctrl+Shift+T)
你是否厌烦了输入词语例如StringBuffer buffer = new StringBuffer();?现在不必再重复了在版本中你可以输入SBCtrl+SpaceSpaceCtrl+Space = newCtrl+Space();来代替在此我们使用了次击键来代替了次击键想在一个变量名前加入一个不同的前缀吗?没有问题只要在第二个Ctrl+Space之前输入它即可例如在版本中Element root+Ctrl+Space完全等价于Element rootElement(见图)
图在版本中内容助理(Ctrl+Space)继续得到改进现在它支持CamelCase并且保存已经输入的字符
下面一项特征更节省时间在版本中Ctrl+Space将根据你的使用模式动态地重排它的建议因此例如如果你总是把ArrayList实例赋值给List变量那么ArrayList建议将排在第一位以便你可以更快地选择它现在代码完成功能甚至能够工作于Javadocs中因此你可以创建@links或常用引用而不必记住这些长名
你是否提出过这样的问题如果IDE足够聪明能够找出在这一行中存在问题那么它为什么不能改正它?如今Eclipse加入了一种特征称为Quick Fix它可以实现这一功能甚至更多只要把你的光标放到有问题的一行代码上并且按下Ctrl+键那么Eclipse将提供有关于修改它的建议
Eclipse的每一个新的发行版本都加入一些新的修改例如在版本中如果你得到关于使用原始类型的一个警告那么你只要把光标放到那一行上然后按下Ctrl+并且选择一种修整例如Add type parameters即可还有在版本中Quick Fix能够维护同一个文件甚至在多个文件中的许多问题而不必单独处理每一个问题
我想强调的另一个特征是重命名类型如果你象我一样那么你会经常把你的变量和方法类似于你的类型命名例如如果你有一种Bar类型那么你可能有一个变量fBar和一个方法createBar(见图)问题是如果你想把Bar重命名为另一个名那么你还要修改其它大量的地方但是在版本中把具有相似名字的变量和方法统一地改变为你想要的新名字是极其简单的事情这种神奇的重命名功能是版本提供的我最喜欢的特征之一
图当你在Eclipse 中重命名一类型时它提供具有类似命名的重命名变量和方法
运行
在一些IDE中你一般要设置一个工程为主工程并且使用一个全局的Run命令来运行这个程序相比之下Eclipse却不是以这种方式工作在Eclipse中你拥有一串启动配置它们包含有关于运行调试或测试代码的所有的详细资料例如命令行参数类路径JRE版本等等在Eclipse 中通过使用过滤和执行环境管理启动配置更为容易
过滤让你根据你感兴趣的内容进一步裁减配置列表执行环境让你使用一种通用命名例如JSE来描述一个Java运行时刻的能力Eclipse能够选择满足或超出你指定要求环境的JRE版本
你是否曾发现自己在开发期间不断地运行多个测试集?在版本下你可以在同一时刻运行多个测试集并且你可以回溯和查看以前运行的历史Eclipse 还支持最新版本的JUnit(版本)
团队开发
你是否曾发现自己盯着一行代码发愣谁加入的这些代码?为什么?Eclipse 能显示基于颜色的注解以便确定在当前文件中各部分内容的作者这是通过读取CVS历史(见图)实现的把鼠标停在一个更改块上将显示开发者的姓名相应的日期和注释信息它还会高亮在文件的其它部分中作过相同修动的代码
图CVS Quick Diff注解显示基于颜色的注解(在当前文件中各个部分的作者)在某一部分上停留鼠标将显示该修改版本的细节
我确信你也有这种体会你调用其他人编写的代码并且一切都能顺利工作直到它们以一种新的版本出现然后你开始遇到一些过时的警告更有甚者出现一些编译错误直到你修改你的程序来适应其改变好了现在的Eclipse 引入了一种非常酷的特征称为重构脚本极大地简化了这一过程
当然重构简单地意味着改变源码而不改变其行为例如也许存在拼错的字段或者一个方法需要一个新的参数Eclipse一直为自动化类似的修改提供良好的支持而且现在它还为消费者也提供了帮助
你实现的每个重构操作都记入历史Eclipse 让你把这一历史写入到一个脚本文件中以后再使用之你可以把这些脚本保存到CVS中或把它包括到一个JAR文件中这样以来该JAR的用户就能够在他们得到一个新版本时恢复同样的改变这与应用补丁是不同的补丁只能针对导致它们的具体的源文件操作而重构脚本却能够针对任意的使用重构API的源码文件操作
维护一种不断增长的API是一项相当困难的工作现在Eclipse使得这一工作容易多了当你重命名一个方法时Eclipse 能够保持旧的方法不动把它标记为过时的然后对之进行重定向以便调用一个新方法并制作一个重构脚本以自动地转换所有调用者当它们导入你的新的JAR文件时
代码清洁器
一直以来Eclipse具有一种相当强的代码格式化功能以帮助整个团队的代码格式化标准在版本中提供了一个新的Clean Up向导(见图)进一步加强了这一功能下面列出这个向导的一些选择实现功能
· 删除不用的导入功能
· 删除不用的private方法和构建函数
· 添加缺乏的@Override和@Deprecated注解
· 添加缺乏的$NONNLS$标签或删除不必要的那些标签
· 把所有循环转换成增强式的for循环
· 把控制语句体转换成块
· 删除不必要的强制转换
· 把串行序列版本ID添加到Serializable和Externalizable类
Clean Up向导能够在一个Java文件一个包甚至整个工程上运行
图Clean Up向导让你在整个工程范围内应用一致的标准
结论
如今比较于任何其它语言和平台来说有相当范围的工具可以供Java程序员选择利用我也搞不清楚这其中的原因也许这是用户的巨大能量和积极性所致或者是缺乏单个主流供应商的结果无论什么原因Eclipse都能够与许多选择对象包括NetBeansIDEAJDeveloper和JBuilder进行媲美随着版本的发行Eclipse对Java IDE的许多方面都是一次大的跃进这将会使所有的Java程序员受益不管你最终选择哪一种工具