关于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官网

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理