Groovy学习:第二章 Groovy语言的关键特征

1. 断言Assertion
断言:用于判断预期的条件是否为真。

例子:
def list = [1,2,'x']
assert list.size()==3

2. AST转换期使用的注释
AST转换的注释:Groovy提供了在AST转换时的注释,比如@Singleton注释。

当Groovy编译器编译Groovy脚本和类时,Groovy解析器(编译器的前端)会在为类创建最终的字节码之前创建一个抽象语法树AST,AST是源码在内存中的表现形式,比较类、方法、属性、语句、变量等。

@Singleton
class SomeSingleton
{
// ...
}

@Singleton注释指示编译器创建一个私有的构造函数和一个静态方法,在AST转换时产生一个单态实例。

简单地测试了一下:

@Singleton
class SomeSingleton{
// 
}
def s = SomeSingleton.getInstance()
s.class.methods.each{
    println it
}

执行后输出了:

public void SomeSingleton.setProperty(java.lang.String,java.lang.Object)
public java.lang.Object SomeSingleton.getProperty(java.lang.String)
public static SomeSingleton SomeSingleton.getInstance() //注意这里
public groovy.lang.MetaClass SomeSingleton.getMetaClass()
public void SomeSingleton.setMetaClass(groovy.lang.MetaClass)
public java.lang.Object SomeSingleton.invokeMethod(java.lang.String,java.lang.Object)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

 
3. 建立器Builder

在Java中要生成一个最简单的XML文档都是很费劲、费时的。Groovy通过内建的Builder类简化了XML的生成。如下面的例子所示:

def builder = new groovy.xml.MarkupBuilder()
builder.employee{
  name 'John Doe'
  gender 'male'
}

执行后输出:
<employee>
  <name>John Doe</name>
  <gender>male</gender>
</employee>

Result: employee

4. 闭包Closure

闭包:Groovy的闭包是一个可重用块,包含在大括号{}中,闭包可以被赋值给属性或变量,或作为参数传递给方法。

例:
def name = 'Chris'
def printClosure = { println "Hello, ${name}" }
printClosure()
name = "Li Sir"
printClosure()

执行后,代码输出:
Hello, Chris
Hello, Li Sir

5. GDK

Groovy是由完整的Groovy语言、Groovy指定的库和GDK共同组成。GDK是现有JDK基础上的Groovy扩展。GDK = Groovy JDK

详细内容可参考:http://groovy.codehaus.org/groovy-jdk/

6. 元编程Metaprogramming

元编程:意味着写一个程序来创建、查询和操纵其它的程序或者是自身。元编程既可以出现在编译时,也可出现在运行时。

编译时元编程的契约是字节码的生成。在Groovy中,编译时元编程使得你可以在产生最终的字节码之前修改AST。

在Groovy中,运行时的元编程是使用元对象协议实现的。

例:
String.metaClass.firstUpper = {->
  return delegate[0].toUpperCase() + delegate[1..delegate.length()-1]
}
println "iiii".firstUpper()

执行代码,输出:
Iiii

7. 本地JSON支持

本地JSON支持:JSON是轻量级的数据交换格式,用于替代XML,作为网络上结构化数据的传输和序列化。

如下面的读JSON例子:
import groovy.json.JsonSlurper
def slurper = new JsonSlurper()
def result = slurper.parseText('{"person":{"name":"John Doe","age":40,"cars":["BMW","FORD"]}}')
println result.person.name
println result.person.age
println result.person.cars.size()
println result.person.cars[0]
println result.person.cars[1]

执行代码的结果如下:
John Doe
40
2
BMW
FORD

8. 本地支持Lists和Maps集合

Groovy增强和改进了Java集合类的声明语法和附带的方法。Groovy为List和Map包含了第一级的构造,还添加了新集合类型:Range。

例子:
authors = ['Vishal','Chris','Joseph','Jim']
println authors
println authors[0]

程序输出:
[Vishal, Chris, Joseph, Jim]
Vishal

9. 本地支持正则表达式

10. Groovy只有对象

在Groovy中,一切都是对象,没有原子类型。

在Groovy中,所有的操作符都是方法调用。

11. 字符串插值

字符串插值:是字符串内替代表达式或变量的一种能力。Java不支持字符串插值,必须手动的连接值。

例子:
def lastName = "Layka"
def fullname = "Vishal ${lastName}"
println fullname

输出:
Vishal Layka

12. 静态和动态类型

静态和动态类型:Groovy在声明变量时支持静态和动态类型。动态类型使用def关键词。

比如:
def var = 10
var = 'It's a String"

可见,定义的类型可变。

13. 静态类型检查

静态类型检查:Groovy 2.0引入了@TypeChecked注释,它可以对需要进行静态类型检查的方法或类进行注释。

import groovy.transform.TypeChecked
void doIt(){}
@TypeChecked
void test(){
  dott() //compilation error:cannot find matching method dott()
}

程序运行时提示错误信息:
1 compilation error:

[Static type checking] - Cannot find matching method ConsoleScript15#dott(). Please check if the declared type is right and if the method exists.
 at line: 5, column: 3

14. 静态编译

静态编译:Groovy 2.0通过@CompileStatic注释使得静态编译成为可能。此模式消除了运行时的动态调度的开销。

例如:
import groovy.transform.CompileStatic
@CompileStatic
int doubleIt(int num){
  2*num
}

assert doubleIt(3) == 6

使用@CompileStatic注释将会静态的编译代码,产生的字节码和Java字节码运行的一样快。此注释可以注释类和方法。

15. 可选语法

访问修饰符:在Groovy中,类无访问修饰符则被认为是public;而属性无访问修饰符则认为是private。方法无访问修饰符则认为是public。

而在Java中,方法和域默认是包访问范围。

16. 检查异常

检查异常:在Groovy中,检查异常无需声明或捕获,Groovy会自动封装异常作为RuntimeException。

17. Getters和Setters

Groovy引入了GroovyBeans,它支持属性的直接使用,与public域相似。

18. 导入语句

默认情况下,Groovy总是导入以下的包:
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.util.regex.*
java.net.*
java.io.*
java.math.BigDecimal, java.math.BigInteger

19. 圆括号()和分号

圆括号()和分号:在Groovy中都是可选的。

20. 返回类型和return关键字

返回类型和return关键字:它是方法中的最后一条语句,而且return关键字是可选的。最后一条语句的结果值总是会返回方法调用。

如果def关键字被用于返回类型,那么Groovy会在运行时动态地计算返回类型——取决于具体返回的值。

例如:
def greeting(){
  result = "Hello world"
  result
}
println greeting()

输出结果为:
Hello world

http://blog.csdn.net/chszs/article/details/8760323

猜你喜欢

转载自itommy.iteye.com/blog/2307224
今日推荐