作为Java未来的后继者之一,Scala最近受到了大量关注。Groovy的创始人James Strachan和James Gosling、Charles Nutter一样,是Scala的拥趸,后两人分别是Java的创造者和JRuby的核心开发者。
James首先解释了他不喜欢的Java特性:
Java 是一个令人惊讶的复杂语言(规范有600页,但是有人的确对Java的特性心领神会了吗?),表现在它的自动装箱 (在这里隐藏了可爱的NPE),原生类型,讨厌的数组(它们不是collection,而且由于缺少多态性,对于通用数据结构和bean特性需要很冗繁的 语法,并且仍然没有闭包(即使在JDK7中),导致了大量令人烦躁的try/catch/finally的语句,除非你使用包含了全新自定义API的架 构,但是这样会导致语言更加复杂。Java甚至有类型引用,不过我们还是不要使用它来存储任何typing/reading。
尤其是没有Java7(即使在Snorcle之后它显得更加有意义 - 我想知道javac是否会被jdkc取代?我猜javac已经达到其巅峰;而且闭包看起来不会带来任何的简化或者进步),这个问题表现得更加严重。
他看起来已经被Scala深深影响了,尤其是当他说到如果那个时候有可用的Scala,那么他不会一开始就去发明Groovy:
老实说,如果在2003年就有人给我介绍了Martin Odersky Lex Spoon和Bill Venners的Programming in Scala,那么我很可能不会创造Groovy。
当然,也有一些Scala的特性他不是那么热衷:
对于任何一门语言来说,都有你喜欢和不喜欢的东西。Scala给我的早期印象的确看起来它在尝试使用一点更多的符号,但是你不需要全部使用。如果你喜欢,你可以仍然使用Java风格的OO。但是我想未来为“特殊物体”使用符号来避免和标识符冲突。
我 不是嵌入import语句的狂热粉丝,使用_root_.java.util.List来区分从相对import 中得到的“全局”import。我更喜欢子前缀,例如,如果你从com.acme.cheese.model.Foo导入,那么导入 model.impl.FooImpl的时候,我喜欢使用一个相对前缀,也就是说,导入_.impl.FooImpl将会使事情简化,而且和Scala在 简化和删除冗余代码(导入java.util._是多种类型的)保持一致。
任何时候和Java相比,James都认为Scala好太多了:
Java的不足可以比作大量的毛疣,那么同样在Scala中,这些地方正是表现了Scala的美、简化和强大。
Adam Bien在他的博客中指出,即使是Java之父James Gosling,看起来也是对Scala喜爱有加:
在一个社区(java.net booth)举办的和James Gosling对话会议上,一个与会者问了一个非常有意思的问题:“除了Java,现在你会把哪种语言运行于JVM之上?”。答案是惊人地快速简洁:Scala。
Charles Nutter,JRuby核心开发者,他也认为和Groovy和JRuby相比,Scala更可能替代Java:
我 必须说Scala看起来是是现在Java王座的继承人。其他在JVM的语言看起来不可能有Scala那样的能力来取代 Java,Scala背后的推动力是无可置疑的。Scala还不是一个动态语言,但是它有许多流行动态语言的特性,例如它的灵活富类型系统,稀疏和简洁的 语法,函数式语言和面向对象范式的完美结合。Scala的缺点:“太复杂”或者“太丰富”,但这些可以通过编码规范很好避免,从而构建更健壮的编辑器和工 具,以及指导多语言开发者明白如何更好地使用Scala。Scala是JVM上静态语言的重生,它也像JRuby那样延伸平台的性能,这些都是Java做 不到的。
Scala现在已经是今年JavaOne的一个主题,有一些相关的议程,而且在大会的最后一天甚至会有一个开放的讨论。
你怎么想呢?Scala是不是在将来最合适取代Java的语言?或者,Java是最后一门巨型语言(LBL)?