之前就有说过,很多人之所以选择Groovy就是因为其学习成本低,只要你有Java的基础,学起来相当快。与此对比的是Scala(另一种JVM动态语言)语法就比较难学(虽然还没学过,但是网上的评论是这样的)。
作为一个Java程序员,我要逐渐把自己Groovy。
从JDK到GDK
1、JDK作为Java开发的核心,是所有Java程序员都需要学习和使用的部分。Groovy在设计GDK的时候非常贴心贴心贴心(重要的感情抒发三遍),GDK可以认为是JDK的扩展和超集,很多Java API在GDK里你都可以找到,甚至是Java文件都可以用Groovy编译运行,这为混合使用Java和Groovy提供了极大的便利,Java程序员可以以极低的代价来嵌入Groovy代码,扩展Java,提高编写效率。
2、Groovy与Java的血缘佐证
1 def str = "I‘m a String" 2 println str.class.name
运行结果:
1 java.lang.String 2 [Finished in 0.7s]
可以看出,Groovy中的对象其实就是Java对象,虽然它可能已经被扩展了。
再来一个例子:
1 def num = 3 2 num.upto(5){println "$it"} 3 println num.class.name
运行结果:
1 3 2 4 3 5 4 java.lang.Integer 5 [Finished in 0.7s]
Groovy扩展了Integer,加入了upto()方法。
Groovy是轻量化的Java(各种省)
再次重申这一点,主要是因为在学习Groovy的过程中,经常会有这样的感叹“唉,这个竟然不需要做了”又或者是“这个竟然可以这么简单的写!”,其轻量、快捷的特点体现在许多方面。
1、安全导航操作符(?.)
Java里充斥着if (obj != null){obj.doSomething();}的代码,但是在Groovy里,仅需obj?.doSomething()。瞬间感觉Java弱爆了~
2、分号可省,引用可以不具名(用def就可以了)
3、不想catch就不用处理异常,而不是Java里被throws逼的必须写
4、return也可以省
5、getter、setter也省了,类似car.engine其实是调用car.getEngine()
6、具名参数(再也不用记住参数顺序了)
7、多赋值(感觉学的python,不需要为了返回多值而建个莫名其妙的类了)
8、通过使用as和asType,代码块可以直接作为接口的实现被传入
9、更便捷的循环 例如for(i in 0..100){}
10、静态导入,导入静态方法(类似于python,可以使用as创建别名),直接通过方法名引用
11、编译时不进行类型检查的范型(Groovy只会在运行时推断,推断失败了就抛异常)
12、类似于lombok的注解
13、操作符重载(在设计DSL的时候超级有用)
好吧,Groovy也有我讨厌的部分(学到目前而言)
1、布尔值的求解
不同类型的规则竟然还不一样,比如Collection非空为true,Number不为0等等。隐式就是灾难啊!谁知道动态运行时莫明奇妙的拿了个什么类型的对象拿去判断,计算布尔值。
Groovy设计者给Java程序员挖的坑:
1、Groovy中的==等于Java中的equals()方法,Java中的==用来判断引用是否相同,在Groovy中对应is()方法
2、Java代码中如果变量名为it这样的Groovy关键字,会报错。
简单总结下,除了一小部分不同外,Groovy的语法与Java极为相似,相互的兼容性很好;Groovy就是Java的动态扩展。