Eclipse插件开发中10种最容易犯的错误

本文总结了Eclipse插件开发过程中常见的十个错误,包括忽视JavaDoc、未提供默认构造函数、过度集中代码资源等问题,帮助开发者避免这些陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在多年培训Eclipse插件开发的过程中,我发现新手总是容易犯一些重复的错误。以下是我总结的最容易犯的10个错误,希望能对大家有所帮助。


(10) 不读JavaDoc

这是所有Java程序员都容易犯的错误。

(9) 忘记写default constructor

Eclipse插件编程中,大部分在plugin.xml中定义的class都必须有default constructor,因为这些class往往是通过reflection来实例化的。例如,你辛辛苦苦写了一个wizard类,而且这个类也能和WizardDialog一起正常工作。但是你却会发现这个wizard类如果作为INewWizard这个扩展点的一个实现(定义在plugin.xml中),就无法工作了。很奇怪,对吧。最后,你会发现罪魁祸首就是default constructor。

(8) 把所有的东东都放在一个plugin中

新手总是喜欢把所有的东西(代码,资源文件,等等)都放在一个plugin中,这其实违背了模块化编程的原则。正确的做法是把你的代码分散在多个相互关联的plugin中,注意其中的依赖关系,这样有助于提高代码的可读性和可维护性。在通常情况下,你至少应该把代码分成两块:UI和Core。

(7) 使用 "internal" 代码

Eclipse中几乎每一个plugin都有自己“internal”的代码(往往放在类似于“com.mycode.internal ”包中,而且在manifest文件中并没有export出来),这些代码是“不稳定”的代码,也许下一个版本就删了或者被改得面目全非了,所以使用这些代码是有很大风险的。但是,很多人还是乐此不疲的使用这些internal的代码。如果你发现某些internal的代码确实很有用,你可以给这个plugin的owner提交一个关于API的bug,或者是把代码拷贝过来直接使用(注意版权问题哦)。

(6) 直接设置classpath

所有plugin项目都是Java项目,但是这并不意味着你可以直接更新Java classpath,因为plugin在运行时的classpath是不同的。如果你需要修改classpath,你最好在plugin编辑器(双击plugin.xml)中的Runtime页中修改。


(5) 忽略文件 build.properties

常常会出现这样的问题:在plugin中新建一个文件夹,在这个文件夹中添加一些资源文件,在代码中使用了这些资源文件,在Eclpise开发环境中调试的时候没有任何错误,但是一旦当作一个独立的plugin(或者product) 发布(export/deploy)出去以后,就找不着这些资源文件了。这是怎么回事?其实问题就在于build.properties并不知道你新建了文件夹和资源文件,所以在发布的过程中并没有把这些东西打包进去。所以,当你新增了一些文件夹或文件时,你最好确认build.properties中包含了你想要的东西。双击build.properties文件就会出现build编辑器,你可以在这个编辑器中更新你想发布的东西。


(4) 空的 dispose 方法

记住一句金玉良言:When you create, you dispose。当你使用完SWT资源(例如image和font)后,你应该及时dispose这些资源。当你override dispose方法时,记住一定要先调用super.dispose(),这样才能有效的释放那些被父类创建使用的资源。当你使用了任何的listener(例如IPartListener,IResourceChangeListener)时,记得在恰当的时候remove这些listener。当你的plugin占用越来越多的内存,而且无法释放时,你就该想想dispose的问题了。

(3) 忽略 monitor.isCanceled()

如果一项任务需要花很长时间,用户可能需要cancel这个任务。在Eclipse中,我们可以很轻松的实现Cancel这个功能。但是往往用户会抱怨某些任务cancel不了,或者在点击cancel按钮以后很长时间才被cancel掉。其实,在Eclipse中,如果你实现了一个时间很长的任务,那么你必须考虑把这个任务分成很多小的任务块,并且在每个任务块完成时都去检查是否被用户cancel了(IProgressMonitor.isCancelled)。相信我,如果用户点击“Cancel”按钮,但是长时间没有任何反应,这将是一个非常糟糕的用户体验。


(2) 让自己的东东无处不见

大家都会有这种想法:我的plugin是最重要的,我应该把它展现在所有可能的地方。例如,你写了一个View,于是你把这个View放在所有的Perspective里,因为你的View是最重要的。而事实往往是残酷的,你的View对于大多数用户来说只是累赘。所以:

  • 不要把你的View放到所有你所知道的Perspective里。
  • 不要轻易扩展org.eclipse.ui.startup,除非这是必须的。
  • 不要让你的action set出现在所有的Perspective里。
  • 试着不去创建一个modal dialog。
  • 当你想通过objectContributions添加自己的菜单时,试着使用最具体的类,不要用过于抽象的类,例如Object。

(1) 在Display线程中执行一个长时间的操作

这是一个很容易犯的错误,即使是有经验的程序员也经常犯这个错误。这样做的后果就是:UI长时间没有响应,用户体验极差。是不是只有运行在Display.asyncExec()或者Display.syncExec()或者UIJob中的线程才算是Display线程呢?其实所有运行在SWT listener中的线程也都是Display线程,所以在这些Display线程中,不要去执行一个长时间的运算或者一个长时间的网络访问。如果你必须执行一个长时间的操作,你可以把它分割成小的任务并及时返回,这样UI才会保持一种响应状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值