之前用了一段时间Grails,收获良多。但是同时也接触到了Scala,当时只是看了下特性,与Groovy对比一下,感觉确实优点很多。最近正好不忙,就抽空看了下,现在觉得这门语言实在太棒了。原先感觉Groovy可以给java做很好的补充,特别是Grails框架给Web开发带来了很多便利。现在感觉Scala确实有实力替代java,做底层开发用Scala会更好,做Web也可以使用Lift框架。
先说说缺点,我从一个java程序员的角度来谈谈:
1. 有一定的学习成本。虽然Scala也是基于jvm的,但是他的语法和java有不少出入,要适应这些语法就需要时间了。而且这个是函数式编程等一些java没有的特性,这就导致很多编程思想从根本上不一样,也需要转变一下。比如没有continue和break,这个是命令式编程才有的,写Scala要换换了。
2. 与java的互操作性不如Groovy。这点主要是由于引入了太多新的理念,这些都是java中没有的,因此java回调Scala会比较麻烦。好在Scala调用java比较容易,所以主体代码用Scala写,这样还能很随意的调用java的包。
3. 启动速度较慢。虽然Scala也提供shell方式运行,也能用脚本方式直接编译运行*.scala的程序,但是和python比,都要慢。这主要是慢在启动和编译的速度上,还好执行效率还是很高的,但是做脚本来用,总是有那么一点点不爽。
4. IDE功能还有待加强。Eclipse设计还真是差强人意,插件支持一直都不是那么好,做Grails和Scala都发现有很多以前做java开发常用的功能都会出问题。这也造成很大的不便,希望能早日改进。
5. String操作还是不够理想,为什么就不能像python3那样操作string呢。还好有%s这样的占位符,但是不能给占位符命名,看上去还是不够直观。用+的方式感觉是相当难看,复制出去还要改N多东西。另外bean的定义还是很喜欢Groovy的方式,像new bean{ name:"myName" },那个写出来感觉很直观,顺序也可以随意点,特别是参数很多的时候。难道是因为DRY原则没有这么做吗?
上面很多都是我个人的牢骚了,这些缺点基本都是可以接受的。特别是如果你接受了Scala的新理念,这些都是会有更好的编程实践,所以这个投入还是很值得的。
说说优点吧,如果这些优点正是你寻找的特性,那么Scala真的是很不错的选择。
1. 多线程并发编程的Actor模型。这个是最吸引我的特性,他与Erlang类似,解决了多线程时资源竞争问题,这样你就可以少了很多不得不仔细考虑还容易出错事情。java7里面的Fork/Join模型也不错,但是还是基于内存共享的方式,还是有潜在的问题。Actor模型不一样,他是不共享内存资源的,可变的内容只能是private的。这从根本上解决了资源竞争问题。但是如果有可变内容,其实还是串行执行的,但是Actor还是利用了多核的优势,具体执行任务的核是由调度器分配的,这也是没花什么力气就用上了多核。多么美妙的事情!
2. 简洁的函数式编程与闭包。其实我对这个编程方式理解还不深入,但是他简洁优美的代码却已经深深吸引了我。这种编程方式是让你能更专注于实现,而不是细节,而且Curry化让函数更优美。比如让一个List[Int]里面的值都乘以2,想想java那恶心的for循环吧,貌似我们很多地方都要用for循环去干这些简单的事情,Scala中我们这样做list map { i => i*2 },或者简写成list map ( _ * 2 )。是不是异常优美?
3. 静态类型与动态声明。我最不喜欢动态语言的地方就是类型都是在运行的时候才会被推演,如果代码中类型弄错了,不执行那句话,你是不会知道错误的。但是静态类型在编译阶段就会检查这个问题,而且编译时类型就定下来了,效率也明显提升。但是def、var方式的类型声明确实很方便,这个比java这种一个个声明爽多了,而且默认都是public,也省了很多废话。特别Scala推崇不变性,而利用val就直接可以声明,用起来也很方便。另外,提供了Option类型来替代了可能返回的null,这比Groovy重写了if方式(用if(bean)来表示if(bean!=null))高明多了,null是程序出错最多的情况了,很多情况的exception还不得不返回一个new Bean()这样一个空对象来避免这个问题。
4. Scala的Collection。用他的List、Map、Set有很多函数式操作的方法,特别是foldeLeft、map、filter、mkString、toXXX,用起来优美简单,相当有爱!
5. 强大的模式匹配。一直感觉if语句非常恶心,但是java的switch语句限制又太多,冥冥中感觉就应该有这样强的pattern matching才是最好的。Scala提供给我们一个非常强大、易用的case方式,再加上对正则表达式的简化,太好用了。想想之前写代码,还一直用自己写的正则表达式封装库,这下有更好的替代品了。
6. 方便的bean定义。java的bean定义应该是原始社会的产物了,一堆堆的getter和setter,如果没有IDE,我估计每个人都会崩溃的。Grails里面的定义很漂亮,里面的mapping和constraints可以把数据库和前台的页面都挂上,非常非常棒!Scala也省去了那些无聊的getter和setter,用var或者val去声明,貌似Groovy没有不变量val的声明。至于Web方面的Lift框架,我还没研究过。反正都比java强!
7. 不强制catch Exception。这个非常好,再也不用为了Thread.sleep(1)这样的代码写catch了,自动向上抛异常。但是你不会忘了需要catch的exception吧?
8. Trait。这个我不知道怎么评价了,说到设计模式,应该是针对接口编程的。但是Trait里面混入了实现,貌似不是更好的实践。但是用起来确实方便,特别是可以混入多个trait,在new的时候可以临时引入,虽然我很喜欢这样,但是会不会陷入针对实现编程的圈圈里面呢?还请高人指点!
9. 方便的io操作。目前新兴语言基本都提供这个,java重写的nio虽然性能上去了,但是api用起来还是要写很长代码。特别可以直接对XML操作,这个和Groovy一样了,都是很大的进步啊。看到java那几种解析XML的包,也每个统一方式,用起来也没原生支持爽。但是唯一可惜的就是不能像python那样对url下载这类的操作,可能是有了HttpClient,他也不再重复造轮子了吧。
10. scalatest。比JUnit提供更多方面的函数,而且也可以用JUnit去运行他,相当方便。但是有点非常遗憾,我特别喜欢用test函数来写测试,又漂亮又清楚。但是这样貌似就不能用JUnit去调用了,而公司要求生成报告,只能用JUnit了。不知道Scalatest有没有生成报告的功能啊。
不知不觉写了挺多的,真的很喜欢Scala,而且我也打算用Scala来代替java了。java7还在制作中,但是如此多的特性估计java背上兼容性的包袱,也很难有很大突破。编写前台的话可以考虑研究Lift框架,或者用Scala+Spring+ibatis,但是如果写后台,我都找不到拒绝Scala的理由了。
如果你对Scala也有兴趣,欢迎一起研究~!
本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/425456,如需转载请自行联系原作者