讀書-Groovy in action

Groovy和java是什麼關係呢?人們都說Groovy和java很像,究竟哪裏很像?人們都說Groovy相對於java更加的簡潔,語言表達力更強,又何以見得呢?java

 

首先我想從如下三個方面來闡釋我所理解的Groovy相對於java更強的語言表現力。從易到難排序:閉包

第一:GStringspa

java中的string以及Groovy中的普通String都是java.lang.String的實例;而GString則是groovy.lang.GString的實例。code

從外形來看,Groovy中的普通字符串用單引號括起;而GString則使用雙引號。orm

那麼爲何要引入GString呢,他又能帶來普通字符串所不具備的那些特性呢?對象

GString中容許存在佔位符而且能夠在運行時對其進行替換。blog

好比:排序

def name = 'Garfield'字符串

def sampleGString = "My name is $name"get

那麼引入這種GString有什麼具體的好處呢?

1)打印消息的時候不用再使用String.format了;

2)Groovy中的方法名能夠用String命名,使用String命名方法一方面加強了方法的可讀性,另外一方面GString使得方法的動態調用成爲可能。

╮(╯▽╰)╭,知道本身沒能解釋清楚,給個例子:

void setField(String type, String value) {
    "add $type"(value)
} 

def 'add name'(String value) {
  //some code
}

def 'add hobby'(String value) {
  //some code
}

若是用java就要寫成這樣了:

void setField(String type, String value) {
  if(type == 'name') {
     addName(value)
  } else if (type == 'hobby') {
     addHobby(value)
  }
}

第2、Closure(閉包)

閉包對於java來說是新的概念,但其自己確實不是一個新概念了。

在面向對象的世界裏,Closure也能夠看作一個對象,只是普通的對象有屬性,有行爲;而closure就是隻有行爲沒有屬性的對象了。

簡單來講,closure就是一個用花括號括起來的代碼塊。

但因爲上面講的,咱們徹底能夠講closure當作一個對象。

能夠聲明,定義一個closure,也能夠把closure當作參數傳遞給方法使用。

def sampleClosure = { println"hello!"} 
sampleClosure()

在一個closure的內部,包括參數與語句兩部分,一般長這樣:

{parameter list-> some statements}

若是closure只有一個參數,則能夠參數隱式的參數it

Closure envelope = { person -> new Letter(person).send() }
addressBook.each (envelope)

那麼相對於java,Groovy提供的closure有什麼好處呢?

那就是咱們能夠沒必要再使用匿名內部類了!

java中,若是想傳遞一個代碼塊給某個方法,則必須定義一個類,使其提供執行該動做的方法,而且將這個類的實例傳遞給那個方法。這樣作的缺點:一方面是沒必要要的增長了定義類的個數;另外一方面是讀起來很差懂。

第3、比較小的一個點是Groovy對於屬性的處理

首先Groovy會自動並且隱式的爲類中定義的field生成setter和getter方法,而且提供了調用該setter、getter方法的快捷方式。

好比:

class Class {

  def field;

}

在其餘類中,Class object = new Class(); object.field = someValue; def var = object.field;

能夠看到在Class中定義了一個field,由此沒必要本身定義getter和setter方法;

在其餘類中使用上述類的實例時,看起來能夠直接訪問該field,但其實是調用了getter setter 的快捷方式。

相關文章
相關標籤/搜索