Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2012-06-28) Xtend rocks!

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

最近在做一个网站时大量使用了xtend,感觉非常好。今年5月推出的xtend 2.3,提供了很多很好(也很基础)的功能,比如定义property、把对property的引用转化为对getter/setter的引用等,再加上它已有的“扩展方法”和“闭包”,用起来就很舒服了。

xtend号称java界的coffeescript。当我们写下xtend代码时,编译器会把它翻译成可读性很高的java源代码,注意是“源代码”,而不是“字节码”。相比jvm上的其它语言如scala等,这是一个巨大的优势:只要是用java的地方,都可以用xtend代替,而不需要处理额外的如编译等问题。这样对于我们来说,写下的是简洁清楚的xtend代码,而对系统或框架来说,它们看到的还是java源代码,皆大欢喜。

正因为有了xtend,让我对一些java框架也不像之前那么排斥了,比如play2-java。play1中大量利用了annotation和javassist来突破java语法的限制,让我们编码时轻松一些,受到了广大java程序员的欢迎。而play2认为play1中魔术太多,去掉了一些魔术,但代码写起来要啰嗦一些。也因此,用play2的人都会半逼迫着去学习scala(或退回到play1),但scala与java库之间的不匹配,有时候会造成很多问题,让人很郁闷。同时因为scala语言本身的难度,用起来很坎坷,所以我一度对play2的未来充满了怀疑。

但现在有了xtend,情况立马变得不同。使用xtend+play2-java,既能保持所有java的优势,又能让代码写起来不那么痛苦。以前需要用annotation来简化的操作,通过xtend定义一些DSL,写起来既简单又易调试。以前用得顺手的java库,现在继续能用,而且还更容易了。再加上xtend学习成本很低,几个小时就能掌握,这的确是相当大的吸引力。

xtend中这几个功能相当好用:

  1. 扩展方法:就像是给已有类增加了新方法,调用起来很流畅
  2. 闭包:大大简化了代码,以前几行的,现在一行搞定
  3. Property:不再需要定义getter/setter,对property的调用也会转化为getter/setter。某些库或框架会对java类的getter/setter做增强,这对xtend来说完全不是问题(对scala就是问题)

据说xtend现在正在实现一个很大的功能,叫annotation custom processing,类似于macro的功能。能让我们控制生成的java代码,实现一些更强大的功能。非常期待这个功能,不过不知道什么时候才会推出。

现在xtend中还有这样的一些小问题:

  1. 未提供代码格式化:连最基本的自动缩进都没有,有点麻烦
  2. 不能自动导入类,必须手动一个个定位再导入
  3. 有些地方的语法还能再简单一些:比如参数的默认值,并行赋值等
  4. 错误提示不够智能
  5. 偶尔生成的java代码有错误(但xtend本身又不提示)

不过这些问题现在都能绕过,不是大问题。期待下一版的改进。

最后的感言就是:学了scala一年多,但实际用在项目中有各种痛苦,效率提不上去,最后放弃。而xtend仅仅几个小时,就能让我感受到了效率的提高,非常感谢。Xtend才是真正的better java。

comments powered by Disqus