Groovy與Java的不同點

本文參考自Groovy文檔 Differences with Java坷虑,所有代碼都是Groovy文檔中的忘分,也可以將本文看做英文源文檔的簡略翻譯嗜逻。

Groovy設計時目標之一就是讓Java程序員快速習慣Groovy善茎。不過在Groovy中也有很多地方和Java不相同神得。列舉如下。

默認導入

下面這些包會由Groovy默認導入饥侵,我們不需要手動導入這些包就可以直接使用其中的類鸵赫。

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

多方法

Groovy的方法調用時機在運行時決定,這叫做運行時分發(fā)或者多方法躏升。下面是一個例子辩棒。

int method(String arg) {
    return 1;
}
int method(Object arg) {
    return 2;
}
Object o = "Object";
int result = method(o);

在Java中下面的斷言是成功的。

assertEquals(2, result);

在Groovy中下面的斷言是成功的膨疏。

assertEquals(1, result);

在Java中由于方法調用時編譯期決定的一睁,而o的類型是Object,所以會返回2佃却。而Groovy是在運行時決定方法調用的者吁,由于對象的實際類型是字符串,所以會返回1饲帅。

數(shù)組初始化

由于在Groovy中花括號用作閉包聲明复凳,因此數(shù)組初始化需要使用方括號。

//java中合法洒闸,Groovy不能
int[] array = { 1, 2, 3}

//Groovy正確的聲明方式
int[] array = [1,2,3]

包訪問權限

在Java中不帶訪問修飾符的字段默認是包可見的染坯。在Grooy中默認是私有的均芽。如果希望在Groovy中設置包訪問權限丘逸。可以使用@PackageScope注解掀宋。

class Person {
    @PackageScope String name
}

自動資源管理

Java7中引入了自動資源管理功能深纲,可以以較簡便的方式打開和釋放資源仲锄。在Groovy中,閉包讓這些工作更簡單湃鹊。下面是一段Java代碼儒喊。

Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException e) {
    e.printStackTrace();
}

對應的Groovy代碼非常簡單。

new File('/path/to/file').eachLine('UTF-8') {
   println it
}

或者還可以使用折中方式币呵。

new File('/path/to/file').withReader('UTF-8') { reader ->
   reader.eachLine {
       println it
   }
}

Lambda

Java 8 支持Lambda表達式怀愧,不過Groovy不支持。Groovy支持閉包余赢。

Runnable run = () -> System.out.println("Run");
list.forEach(System.out::println);

對應的Groovy代碼芯义。

Runnable run = { println 'run' }
list.each { println it } // or list.each(this.&println)

GString

Groovy通過GString來支持內插字符串。如果在單引號字符串中發(fā)現(xiàn)${}妻柒,會發(fā)生編譯錯誤扛拨。另外Groovy可以自動將GString轉換為String,所以我們可以放心的引用各種Java類庫举塔。

字符串和字符常量

Groovy中單引號用作字符串常量绑警,所以我們沒辦法聲明一個字符常量。如果需要單個字符央渣,我們必須顯式聲明一個字符變量计盒,然后用單引號將字符賦給它。

char a='a'

對于字符串和字符之間的轉換芽丹,也有兩種方式:Groovy的as運算符和傳統(tǒng)的Java轉換方式章郁。但是假如單引號之間是一個字符串,這兩種轉換方式就不一樣了志衍。Java轉換會拋出異常暖庄,而Groovy方式會獲取字符串的第一個字母作為轉換后的字符。

// for single char strings, both are the same
assert ((char) "c").class==Character
assert ("c" as char).class==Character

// for multi char strings they are not
try {
  ((char) 'cx') == 'c'
  assert false: 'will fail - not castable'
} catch(GroovyCastException e) {
}
assert ('cx' as char) == 'c'
assert 'cx'.asType(char) == 'c'

基本類型和包裝器

Groovy是完全對象化的楼肪,所以所有基本類型都會轉換為其包裝器來使用培廓。Groovy不支持Java的擴寬優(yōu)先于包裝器的規(guī)則。因此下面的代碼春叫,在Java中會執(zhí)行第一個m方法肩钠,在Groovy中會執(zhí)行第二個m方法。

int i
m(i)

void m(long l) {           
  println "in m(long)"
}

void m(Integer i) {        
  println "in m(Integer)"
}

相等運算符的行為

Java中==會比較對象引用是否是同一個暂殖。而在Groovy中价匠,如果對象實現(xiàn)了Comparable,就會調用a.compareTo(b)==0方法呛每;如果沒有實現(xiàn)踩窖,則調用a.equals(b)。如果需要判斷對象引用晨横,可以使用is函數(shù)洋腮,a.is(b)箫柳。

額外的關鍵字

在Groovy中,def啥供、as悯恍、intrait都是關鍵字伙狐,不要將它們用作變量名等等涮毫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贷屎,隨后出現(xiàn)的幾起案子窒百,更是在濱河造成了極大的恐慌,老刑警劉巖豫尽,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡美旧,警方通過查閱死者的電腦和手機渤滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榴嗅,“玉大人妄呕,你說我怎么就攤上這事∷圆猓” “怎么了绪励?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唠粥。 經(jīng)常有香客問我疏魏,道長,這世上最難降的妖魔是什么晤愧? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任大莫,我火速辦了婚禮,結果婚禮上官份,老公的妹妹穿的比我還像新娘只厘。我一直安慰自己,他們只是感情好舅巷,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布羔味。 她就那樣靜靜地躺著,像睡著了一般钠右。 火紅的嫁衣襯著肌膚如雪赋元。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音们陆,去河邊找鬼寒瓦。 笑死情屹,一個胖子當著我的面吹牛坪仇,可吹牛的內容都是我干的。 我是一名探鬼主播垃你,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼椅文,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惜颇?” 一聲冷哼從身側響起皆刺,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凌摄,沒想到半個月后羡蛾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡锨亏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年痴怨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片器予。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪藻,死狀恐怖,靈堂內的尸體忽然破棺而出乾翔,到底是詐尸還是另有隱情爱葵,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布反浓,位于F島的核電站萌丈,受9級特大地震影響,放射性物質發(fā)生泄漏雷则。R本人自食惡果不足惜浓瞪,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巧婶。 院中可真熱鬧乾颁,春花似錦、人聲如沸艺栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿右。三九已至诅妹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吭狡。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工尖殃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人划煮。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓送丰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弛秋。 傳聞我的和親對象是個殘疾皇子器躏,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)蟹略,斷路器登失,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,219評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法挖炬,內部類的語法揽浙,繼承相關的語法,異常的語法意敛,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • Groovy學習目錄-傳送門 Groovy試圖對Java開發(fā)人員盡可能自然馅巷。 我們試圖在設計Groovy時遵循最小...
    化作春泥_閱讀 1,239評論 0 3
  • 前言 由于項目需要用到 Groovy 語言,這兩天對其進行了粗略的學習空闲,本文是對學習做的一個簡單總結令杈,主要內容參考...
    簡單的土豆閱讀 188,485評論 12 201