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

(2012-01-07) Xtend试用中发现的各问题

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

今天试用了一下xtend,发现问题多多,记录如下:

一、不支持数组,官方说使用newArrayList()代替

二、生成的java代码不够优化

42 + 21

生成的java代码:

int _operator_plus = IntegerExtensions.operator_plus(((Integer)42), ((Integer)21));

三、不支持char literal

如何表示'a','\n'

四、«和» 怎么方便输入(非eclipse环境)

在eclipse中,可以按"ctrl+shift+,“输入« ,按"ctrl+shift+.“输入»,但在非eclipse环境中怎么办呢?难怪一定要开着eclipse才能工作?

五、集合的语法不友好

image

看这里的map和list,是不是让人头晕

六、field不支持类型推断

在方法中可以直接写

val x = “abc”

但声明field时,必须指明类型:

String x = “abc”

七、遍历一个list时,怎么既得到item又得到index

在Java中可以:

for(int i =0;i

String item = list.get(i);

System.out.println(i + “: " + item);

}

在xtend中不知道怎么做,因为我们只能:

for(String item: list) { … }

或者

list.forEach [ item | … ]

Index在哪儿?

最后我写成这样,容易嘛我:

def <T> forEach(Iterable<T> iter, (T, int) => Object handler)  {    
    val i = new AtomicInteger(0);     
    iter.forEach (item | handler.apply(item, i.getAndAdd(1)))     
}

连AtomicInteger都用上了,其实就是想找个可以放int的容器而已

附上唐古拉山写的,我怎么就忘了直接用for呢?

def static eachWithIndex(Iterable list, (T, int) => Object block){

var index = 0

for(e : list){

    block.apply(e, index) 

    index = index + 1

}

}

**八、不支持内部类**

为了改进这个forEach,我想在方法中定义一个int container,没想到也不支持:

[![image](/user_images/706-3.png "image")](/user_images/706-3.png)

好吧,我放在外层,还是报错:

[![image](/user_images/706-5.png "image")](/user_images/706-5.png)

加个static试试?一样的错:

[![image](/user_images/706-7.png "image")](/user_images/706-7.png)

难道我要为了这个只用一次的类,专门声明一个顶层的类?

**九、不支持代码格式化**

这个功能都没有,真让人郁闷啊。老是要手动调整,真麻烦

**十、不支持自动寻找并导入类**

输入了没有import的类名,按Ctrl+Shift+O没反应,必须手动加上import

**十一、代码提示反应慢**

有时候需要近十秒,比scala的编辑器还慢

**十二、不支持断点、调试**

该功能还正在开发中

经过今天的试用,我认为当前xtend的成熟度还未达到“可用”,不宜在项目中采用。不论是编辑器的支持,还是语言本身的特性,都还有很多需要完善的地方。但对于它已经提出的各种特性,以及直接转换为java源文件的做法,我觉得还是很不错的,但还需要时间。一个成熟好用的语言,果然是得靠时间堆出来。Xtend与scala相比,还差很远。

另一个让我失望的地方在于,xtend曾经说他们的卖点是“良好的编辑器支持”,但是实际上还差很远,不说跟java比,连scala都比不过。
comments powered by Disqus