groovy 初步

对 Java 的不满导致了不少 JVM 上的语言的出现,groovy 的诞生和 scala 似乎不大一样,作者似乎当时的 inspiration 来自 python,因此从某种角度 groovy 比起 scala 算是一个好学的语言。不过似乎效率上的问题,就跟 jython 类似使得 groovy 比较受到鄙视。不知道被 spring 抓取之后 groovy 有没有一些 killer application 的出现呢… 这里就稍微记录一些对 groovy 的基本感受。多数情况下 groovy 还是希望保持 Java 的风格(一些常见的关键字都一样的),但是对于 Java 某些无休止的重复书写进行了修改(引入了一些 python 的搞法)、引入闭包等。

组成

在 debian 下的 groovy 已经有 2.0 版本了,提供了以下几个命令行工具:

  • startGroovy 同 groovy
  • groovysh,提供了类似 python CLI 下面的交互式环境
  • grape,package 管理系统
  • groovy,相当于是一个 CLI 的 interpreter
  • groovyConsole,图形界面下的交互式环境
  • java2groovy,和名字一个意思将 Java 代码转换成为 groovy
  • groovyc,这是 groovy 提供的 compiler 可以将 .groovy 文件编译为 byte code

下面是几个实际的例子。

$ groovy -e 'println "hello world!" '
hello world!

不知道为啥最后一个字符会被吃掉… 这个就更像 python 了哈。

#!/usr/bin/groovy

println "hello world!"

我们可以如下执行这个程序

$ chmod +x hello.groovy
$ ./hello.groovy 
hello world!
$ groovyc hello.groovy
$ java -cp /usr/share/java/groovy-all.jar:. hello
hello world!

嗯下面是个无聊的例子。

#!/usr/bin/groovy

class Circle {
  Float radius

  Circle (Float r) {
    radius = r
  }

  Float area () {
    return Math.PI * radius * radius ;
  }
}

c = [new Circle (1), new Circle (2)]
c.each ({
  println "area: ${it.area()}"
})

可以看出来尽管 groovy 学了 python 的行尾分号可有可无但是并没学习那个缩进的策略,这里要求用 {} 分块,然后引入了闭包策略等等。这样编译产生的 .class 可以直接在 java 里面调用的:

public class TestCircle {
    public static void main (String[] args) {
        Circle a = new Circle (1.0f) ;
        System.out.println ("area is " + a.area ()) ;
    }
}

如下执行即可

$ javac TestCircle.java
$ java -cp /usr/share/java/groovy-all.jar:. TestCircle
area is 3.1415927

语法的一些微调

比较大的微调可能就是

  • for 循环现在只做 in 那种了,摒弃了原先的 init; cond; op 的形式,
  • switch 得到了增强(不再仅对 int 等有效了),
  • 把 RE 当作 language feature 来做了
  • 将常用的 List 和 Map 整合到语法中(可以看成是 grammar sugar)
  • 默认就 import 了几个 package,而原先 java 仅仅 import 了 java.lang
  • 字符串里面可以通过 ${} 进行替换了
  • 支持 ”、””、”’ ”’、””” “”” 和 // 类型的字符串表示,最后一个对 RE 的书写格外方便
  • 没有 primitive type 了,现在连 1 都能接方法了,如 1.upto
  • 支持 range,以及 1..2 和 1..<3 等写法
  • 支持 assert
  • 与 Java beans 对应弄了个 Gbeans
  • 函数参数支持默认参数和字典了
  • 支持操作符重载了,方式其实和 python 比较像,不过 python 这类方法都以 __ 开头,而 groovy 就是直接 plus/minus 等等上了…
  • .? 支持处理 null 情形了
  • 函数定义都 def 了,返回类型可以不写
  • 成员访问除了 . 以外还能用字典形式(property)
  • 一个文件里面可以写多个类,但是 groovy 只能找到与文件名同名的类
  • 同样支持 package,也支持 python 类型的 import 语法(import as)
  • 函数的多态是 runtime 的,不再是原先 compile-time 的了

闭包

闭包的出现至少解决了几个 java 里面很常见的问题:

  • interface 的过度依赖性,我们为了传递一个简单的函数还得创建 inner interface 供别人通过 anonymous inner class 实现,多么扭曲的语言啊…
  • 实现类似 visitor 这类 pattern 容易很多
  • 不像 inner class 要求一定是 final 才能在闭包中访问了

GDK 为 closure 提供了一个 Closure 的类,这使得我们可以传递一个闭包对象作为某些类的成员。由于没有成员函数指针,groovy 提供了 .& 表达成员函数的闭包,通过 curry 方法实现 bind 几个参数。调用 closure 可以像一个函数一样,也可以使用 call 方法。在 switch-case 中可以用闭包作为 case 的条件了。

其他

据说 groovy 通过 gpath 对 XML 的支持更加好了,不知道是不是这样后面和 spring 的整合什么的比较有优势呢?如果一个项目里面既有 java 也有 groovy 的代码似乎可以通过增加 ant 的一个 task 处理 groovy 部分的编译,但是更复杂的用途在哪里觉得还需要研究下,似乎公司里面 groovy 的代码见得也比较少。scala 倒是看见过有人用那个 package,代码不是太清楚。

——————
And the LORD appeared unto him, and said, Go not down into Egypt; dwell in the land which I shall tell thee of:

Advertisements
groovy 初步

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s