之前就有說過,很多人之所以選擇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的動態擴展。