乐趣区

关于groovy:初探Groovy

初探 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 官网
退出移动版