Groovy in Action
-- DIERK KÖNIG
Source code is a means of communication: from you to the compiler, to other team members, and then back to you.
There is both a technical and a human aspect in this communication.
reveal the programmer’s intent in the code as clearly as possible
Literate Programming
像寫作文學小說一樣寫程序
a smooth transition
a seamless mix-and-match of Groovy and Java
Grais is the Groovy web application framework.
最值得學習的Groovy框架
Chapter 1
Groovy will build on your existing experience and familiarity with the Java platform.
James Strachan inventer of Groovy
在Internet Cafe學習Python的時候,產生了為Java Platform引進類似Python的動態語言特性
Groovy’s aims
feature rich and Java friendly
Groovy is implemented in Java and Groovy itself.
Agility and Dynamik
DSL: domain specific language
Part 1
Chapter 2
#! shebang
first line comment, to find groovy interpreter
GLS: Groovy Language Specification
Optional parentheses:
帶括號的是method call
不帶括號的為command call, command call只有在參數極其簡單的時候用,比如參數里出現(), []
比如println (1..10).getClass().getName() 容易讓人誤解。
Groovy自動import
groovy.lang.*
groovy.util.*
java.lang.* (Java已經import)
java.util.*
java.net.*
java.io.*
java.math.BigInteger和java.math.BigDecimal
assert是一個keyword, 而不是Groovy加到java.lang.Object的一個method, 所以
assert (1..10).size() == 11不像command一樣有問題
==
測試equality,而不是identity, 即
x == y 等同于Java的 x.equals(y), Java中的x == y在Groovy中為x.is(y)
def keyword means "dynamically typed".
沒有def,沒有type是指environment binding variables,是global的
groovy File.groovy
File.groovy必須是一個Script,a class with main method, a Runnable或者a GroovyTestCase
GroovyBean: Class with Property, Groovy簡化JavaBean
1. Generating the accessor methods, default visibility => define property, generate get/set(if non final)
2. Simplified access to all Bean(JavaBean and GroovyBean) Bean.property
3. Simplified registration of event handlers
GString with "
GString is not subclass of String, No class can be subclass from String , because String is final.
Numbers are objects, not primitive type
Subscript Operator [ ]
Ranges
1..10, subclass of List
Groovy Class Loader
load class from *.groovy transparently
AST: Abstract Syntax Tree
GDK不僅為JDK增加新類,而且為己存在的類增加新的功能。
為己存在的類增加新的功能是怎么實現的?
關鍵是MetaClass, Groovy Code里所有的Method Call都要都MetaClass.invokeMethod處理。
this.foo() generated as(simplified)
this.getMetaClass().invokeMethod(this, "foo", EMPTY_PARAMS_ARRAY)
這肯定會影響Groovy程序的效率,不知道groovyc優化的效果怎么樣? groovyc只是compile time的事情,
無法獲得runtime的信息,更會減少優化的機會,如果有JVM來做的話,優化的機會應該更多一些。
evaluate(code)