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

(2011-09-13) scala,离天堂只差一步

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

 学用scala两个月了,遇到很多问题,也有很多惊喜。scala功能强大,语法灵活简洁,让我深受震撼。现在再让我去写java代码,心理特别抵触,觉得java代码太繁琐了。 

  如果不需要考虑与java的交互,使用scala是一件美妙的事情。写代码时,感觉如行云流水,特别顺畅。一些在java中做起来很复杂的功能,这里很轻松就做到了,这种感觉特别好。 

  然而,离天堂只差一步。 

  scala中的第三方库还是太少了,很多时候,都必须使用java的库。比如数据库orm,mongodb的orm,还有其它一些。scala虽然号称与java无缝集成(因为scala的代码将被编译为java字节码),但是在使用过程中,常常会出现各种稀奇古怪的问题。 

  比如我在java中常用的Ebean,在java下一切正常,在scala里,简单地用起来也正常,突然有一天发现有一个重要的功能,在scala里就是得不到正确结果(可能跟Ebean在后面对java字节码进行了增强有关)。

  郁闷之下,不用关系数据库了,换mongodb。 

  java里有一个mongodb的orm,叫morphia,在java里用起来很爽,在scala下,开始也正常。但是有一天,我想把本来定义在class中的字段放到trait中以重用,可惜morphia报错,找不到trait中的那些字段的类型。如果不能用trait,我干脆直接用java算了。 

  折腾了几天,还是没有好的解决方法,正郁闷着,突然今天群里有人介绍了一个orientdb。 

  一看它的演示文件,这可是个好东西,专为web设计的高性能数据库,直接保存pojo,不需要转来转去。非常激动,如果能用的话,那我可以省很多事了。赶快用scala写了一个简单的例子。可惜竟然编译不过!

  经过检查,这是一个诡异的错误。因为从java的角度看,那些代码没有任何问题。如果在scala中实现类似的功能,也不会有问题。可是从scala中调用java中的那个方法,就会出问题。像这样的问题,真是让人想解决都无从下手。 

  这就是scala的现状。无异,scala本身是优秀的,它的很多设计都是纠正了java中的一些不好的做法。但是它还是太年轻了,使用纯scala写的库太少,有时候必须使用java的库。这时候,两者之间的不匹配会给我们带来很多麻烦: 

1. 两者的集合类不同,必须经常转来转去,这是一个异常繁琐的过程

2. java中使用null,而scala推荐使用Option。这两者处理起来方式不同,两种风格不断冲突

3. java代码中如果某一个函数有重名函数,并且使用了可变参数,在scala中,很可能不能直接调用,而得用一种丑陋的方式去转换

4. 如果java中的代码,使用了一些偏门的语法或技巧(比如大量使用反射,cglib后台增强之类),这些代码很可能在scala中无法正常运行。 

这种感觉,就好像我们正看着喜欢的电视剧,突然蹦出一段广告。如果一两次还能忍了,可惜像我这样做网站的,使用的是java的orm,那就意味着三分钟一段广告。 

  想到之前scala火了一阵,之后使用者又减少了,我想原因就是我现在遇到的情况:使用scala的确很爽,但是我们的工作,必须用到很多java库。这种情况,使用scala带来的麻烦实在太多,还不如用java吧。

  真可惜,scala离天堂只有一步。这一步,不知道需要多久的时间,才能跨过去

comments powered by Disqus