今天试用了一下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才能工作?
五、集合的语法不友好
看这里的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,没想到也不支持: [](/user_images/706-3.png) 好吧,我放在外层,还是报错: [](/user_images/706-5.png) 加个static试试?一样的错: [](/user_images/706-7.png) 难道我要为了这个只用一次的类,专门声明一个顶层的类? **九、不支持代码格式化** 这个功能都没有,真让人郁闷啊。老是要手动调整,真麻烦 **十、不支持自动寻找并导入类** 输入了没有import的类名,按Ctrl+Shift+O没反应,必须手动加上import **十一、代码提示反应慢** 有时候需要近十秒,比scala的编辑器还慢 **十二、不支持断点、调试** 该功能还正在开发中 经过今天的试用,我认为当前xtend的成熟度还未达到“可用”,不宜在项目中采用。不论是编辑器的支持,还是语言本身的特性,都还有很多需要完善的地方。但对于它已经提出的各种特性,以及直接转换为java源文件的做法,我觉得还是很不错的,但还需要时间。一个成熟好用的语言,果然是得靠时间堆出来。Xtend与scala相比,还差很远。 另一个让我失望的地方在于,xtend曾经说他们的卖点是“良好的编辑器支持”,但是实际上还差很远,不说跟java比,连scala都比不过。