用Groovy思考 第二章 Groovy语言的关键特征

简介: 1. 断言Assertion断言:用于判断预期的条件是否为真。例子:def list = [1,2,'x']assert list.size()==32. AST转换期使用的注释AST转换的注释:Groovy提供了在AST转换时的注释,比如@Singleton注释。
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转换时产生一个单态实例。

3. 建立器Builder

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

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

执行后输出:

  John Doe
  male


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
目录
相关文章
|
Linux 测试技术 数据库
达梦(DM)数据库安装
简述windows环境下达梦(DM)数据库安装操作
|
2月前
|
存储 数据库 开发工具
HarmonyOS APP应用开发项目- MCA助手(Day04持续更新中~)
本项目为基于HarmonyOS的端云一体化记账App,集成华为AGC云数据库与认证服务,实现用户注册登录及数据云端存储。通过DevEco Studio开发,解决CloudProgram模块显示问题,完成云数据库初始化与用户信息关联功能。
196 1
HarmonyOS APP应用开发项目- MCA助手(Day04持续更新中~)
|
消息中间件 供应链 测试技术
图解 DDD,这一篇总结太全面了!
DDD领取驱动是非常热的架构设计,微服务也有大量涉及,本文详细解析领域驱动设计(DDD),涵盖DDD原理、实践步骤及核心概念等,帮助更好地管理复杂业务逻辑。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
图解 DDD,这一篇总结太全面了!
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
SQL 运维 关系型数据库
阿里云DTS踩坑经验分享系列|数据不一致修复大法
阿里云数据传输服务DTS在帮助用户迁移数据、同步数据时,在某些复杂场景下会出现源库与目标库数据不一致的问题,造成数据错误,给用户带来困扰。由于数据不一致的问题很难完全避免,为了及时修复不一致的数据,DTS产品推出数据订正功能,保障用户在同步\迁移数据时的数据一致性。本文介绍了产生数据不一致的一些典型场景,并重点阐述了如何使用DTS数据订正功能来修复不一致的数据。
1112 4
|
存储 Java Spring
Spring Boot中的配置中心实现
Spring Boot中的配置中心实现
|
前端开发 Cloud Native JavaScript
【微服务-架构选型】记录2022年微服务技术架构选型
【微服务-架构选型】记录2022年微服务技术架构选型
1500 0
【微服务-架构选型】记录2022年微服务技术架构选型
|
设计模式 架构师 程序员
DDD洋葱架构才是 yyds!阿里大牛手记(DDD)领域驱动设计应对之道
虽然身为架构师,设计一个高质量的架构依然是复杂与困难的。 简单来说,动用大量的资源只为了一套优质的三高架构并不正确,而是该在了解当前业务现状的情况下,创造出灵活、可维护、健硕能成长的。
|
数据安全/隐私保护 安全
单点登录(SSO)看这一篇就够了
背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。
277475 15
|
存储 消息中间件 JSON
领域驱动设计:从理论到实践,一文带你掌握DDD!
学习DDD一个半月,最开始学习DDD的原因是因为我负责的业务线,涉及的系统非常多,想借鉴领域驱动设计的思想,看后续如何对系统进行重构。在没有学习DDD之前,感觉DDD可能属于那种“虚头巴脑”的东西,学完DDD之后,感觉。。。嗯。。。真香!
2180 0
领域驱动设计:从理论到实践,一文带你掌握DDD!