共计 2616 个字符,预计需要花费 7 分钟才能阅读完成。
初探 Groovy
简介
Groovy 是一门 JVM 语言,因而只有有 JVM 即可执行。而且 Groovy 与 Java 能够互相调用,亲测丝滑。
丝滑到什么水平呢?就是在 Java 我的项目我的项目中能够同时并存 .java
和.groovy
文件,能够互相调用。
Groovy 是动静语言,引入很多有意思的个性。如果将 Java 比喻为楷书,则 Groovy 是行书,开发效率很高。而且 Groovy JDK 中蕴含很多实用工具,开发舒服。
指标
Groovy is an optionally typed, dynamic language for the Java platform with many features that are inspired by languages like Python, Ruby, and Smalltalk, making them available to Java developers using a Java-like syntax. Unlike other alternative languages, it is designed as a companion, not a replacement for Java.
—— Groovy In Action(page 44)
咱们的指标不是要替换 Java,而是成为 Java 的搭档。将一些用 Java 解决起来很简单的工序,交给 Groovy 解决。
运行形式
简略而言有两种形式:
- compile:编译期编译为
.class
文件 - runtime:作为脚本由
GroovyShell
动静执行
毕竟是动静语言,出于性能思考,倡议外围代码、底层代码,用 Java。业务逻辑、须要疾速变动的逻辑,尝试用 Groovy。
IDE 反对
因为是动静语言,IDE 反对极为重要。目前 IDEA 反对良好,groovy 插件已退出默认配置。
如何构建?
Build | 配置文件 | 配置 | 评估 |
---|---|---|---|
Gradle | .groovy | 简洁 | 最佳构建形式,但没人用过 |
Maven | .XML | 简单 | 尽管简单,但大家都在用,相熟,倡议用 maven 引入 |
Ant | \ | \ | 淘汰了,不探讨 |
maven groovy 有多种插件,倡议应用 GMavenPlus。
具体配置办法参考:Groovy + Java 混合编程计划:GMaven – SegmentFault 思否
到底有多爽?
POGO
在 Java 我的项目中,纯数据类咱们称之为 POJO。POJO 往往要加一堆构造方法和 getter、setter,尽管能够利用 IDE 生成或者 lombok,然而看着还是很啰嗦。
在 Groovy 能够结构 POGO,
class Person {
String id
String name
String toString() {return "$id,$name"}
}
默认结构、Map 结构、getter、setter 都是默认的,十分简洁。
def person = new Person(id: '67', name: '靓仔')
println person.getName()
除此之外,还能够将 POGO 搞成不能够变类型,连 final
都省了,
@Immutable
class ImmutablePoint {
double x
double y
String toString() {return "($x,$y)"
}
}
对于 POGO 还有一些实用功能,能够参考Making Java Groovy 的第四章。
GString
相似于 Python 的 f-string 和 JS 的模板字符串。GString 中应用 dollar 符作为变量占位符。上面是 Groovy In Action 文中的例子(page 84):
def me = 'Tarzan'
def you = 'Jane'
def line = "me $me - you $you"
assert line == 'me Tarzan - you Jane'
def date = new Date(0)
def out = "Year $date.year Month $date.month Day $date.date"
assert out == 'Year 70 Month 0 Day 1'
out = "Date is ${date.toGMTString()} !" //|#3 Full syntax with
assert out == 'Date is 1 Jan 1970 00:00:00 GMT !' //|#3 curly braces
// 多行 GStrings
def sql = """
SELECT FROM MyTable
WHERE Year = $date.year
"""assert sql =="""
SELECT FROM MyTable
WHERE Year = 70
"""out ="my 0.02$" //|#5 Literal dollar sign
assert out == 'my 0.02$'
json
import groovy.json.JsonSlurper
String url = 'http://api.icndb.com/jokes/random?limitTo=[nerdy]'
String jsonTxt = url.toURL().text
def json = new JsonSlurper().parseText(jsonTxt)
def joke = json?.value?.joke
println joke
接口调用,json 解析零打碎敲。而且取值过程十分简洁:json?.value?.joke
,再也不须要一堆 if else 判断了,也不须要诸如 Optional
的办法取值。
单元测试
Groovy makes testing Java much easier
—— Making Java Groovy
如果想应用 Groovy,然而又对应用于业务逻辑心存疑虑,那么用来写单元测试是再适合不过了。不会影响业务代码,又能够逐渐上手,单元测试写起来又简洁。
class CutoutCustomerIdTagTest {
@Test
void cutout() {def ctx = new DmContext(uid: '001122')
def cutId = new CutoutCustomIdTag().doTag(ctx)
assert cutId == '22'
}
}
class PermissionTest {
@Test
void check() {def permission = new Permission(modify: ['Tom', 'Jerry'])
assert permission.checkModify('Tom')
assert permission.checkModify('Jerry')
}
}
参考文献
- Groovy In Action 2ed
- Making Java Groovy
- Groovy 官网