本文是Java.next系列的第一部分。在这一部分,我将探讨作为Java.next的语言所具有的共同特征。
我选择了四种语言作为“Java.next”的代表:Clojure,Groovy,JRuby,以及Scala。乍看起来,这几种语言有着 很大的不同。Clojure是Lisp方言;Groovy是作为“类Java”的选择;JRuby即具有Ruby语言的优雅,同时也有着Rails所带来 的优势;与其他都不一样的是Scala,它有着静态语言所具有的特点。
正如你所料想的一样,有很多关于这些语言中谁才是最好的辩论。之所以有着这么多的辩论,很大程度上是因为这些语言有着很多共同点。它们有着一个共同的演变背景:Java语言。Java语言所具有的优点以及缺陷影响着这些语言的设计方向。
在这篇文章中,我着重从下面两个方面来阐述这些语言的共同点:
☆ 过去的10年中,我们在基于虚拟机、面向对象的语言编程中得到了很多关于如何开发易读的、可维护的应用。Java.next吸取了这些成果,使得这些语言更注重于问题的本质而不是形式。
☆ “本质 VS 形式”的设计理念使得编程方式发生了很大的改变,这种观念的变化比以前从C/C++到Java的转变更大。
我将Java.next所具有的共同优点概括为以下八点:
● 一切皆对象
● 简洁的属性定义方式
● 易用的集合类
● 函数式编程
● 运算符重载
● 可维护的异常处理
● 给已有类增加新方法
● 创建新的语言结构
一切皆对象
在Java中,我们每时每刻都要面对对象类型与基本类型的不同之处。这种不同导致三个实际问题:
1.API必须写两份:一个针对对象类型;一个针对基本类型。更糟糕的情形是需要重写多份:一个针对对象类型,然后对每一个基本类型各写一份。
2.默认的数值类型有着范围限制,一旦越界,程序会以诡异的形式中断。
3.对于那些高精度类型(译者注:指BigInteger等类型),你不能使用直观的数学操作符(+,-,etc.)来操作它们。
在Java.next中,一切皆是对象。你可以在所有的类型上使用相同的语法调用方法。
; clojure
(. 1 floatValue)
1.0
// groovy
1.floatValue()
===> 1.0
# ruby
1.to_f
=> 1.0
// scala
1.floatValue
res1: Float = 1.0