产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

Groovy 综述:Groovy 1.7、Grails 1.2 及 Groovy Eclipse 2.0,增强的依赖管理与语言支持

  • 2010-01-28
  • 本文字数:2735 字

    阅读完需:约 9 分钟

近日 Groovy 1.7 发布了,该版本对语言本身进行了优化,同时增强了程序库。随后, SpringSource 又发布了 Groovy Eclipse IDE 2.0,增强了对 Groovy 的支持,提供了调试、更棒的内容辅助以及强大的编辑功能,此举弥补了之前 Eclipse 对 Groovy 差劲的支持。此次发布对 Groovy 语言本身和程序库都进行了大量的更新。Java 使用了匿名内部类,而其他语言则使用了闭包或是方法委托,Groovy 就是其中之一。凭借这些新特性,Groovy 可以轻松集成 Java 中使用了匿名内部类的程序库(如果使用闭包的话则无法实现)。相比于每个匿名内部类都要对应一个类的做法来说,这种方式是个极大的改进,同时也使得代码的可读性更好。但官方警告说,从严格意义上讲,该实现并不兼容于Java 实现。

Java 中匿名内部类一个令人生厌的地方是如果匿名内部类需要访问外部的某个变量,那么该变量必须为 final。Groovy 则消除了这种限制,在 Groovy 中,匿名内部类可以修改外部的变量值。

为了能更好地说明这一点,让我们通过 Java 和 Groovy 分别编写一个示例。该示例来自于 Groovy 的发布声明。首先看看 Java 版本的:

复制代码
int counter = 0 ;
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
counter+=1;
}
},0);

在该示例中,我们用 Java 创建了一个 Timer 对象,然后创建了一个 TimerTask,后者将会执行 run 方法,我们希望 run 方法执行后会更新 counter 这个整型变量。然而遗憾的是,该程序无法编译通过,因为 counter 变量不是 final 的。编译器不允许 run 方法访问该变量。那么将其设为 final 的吧:

复制代码
final int counter = 0 ;
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
<b> counter+=1; // compiler error!</b>
}
},0);

现在 run 方法可以访问 counter 变量了(仅仅是读取而已),但却无法更新该变量,因为它是 final 的,这又导致了另一个编译错误!那么采取一些间接的办法吧,比如说将该整型变量包装到一个对象中。我们打算使用 java.lang.Integer,但它却是不可变的,由于该变量需要为 final,我们就没办法重置该变量了。只能再去尝试其他办法了。我们可以使用 java.lang.ThreadLocal 存储该 Integer 并对其进行更新,或者是采用 java.util.concurrent.atomic.AtomicInteger。

复制代码
final AtomicInteger atomicIntegerCounter = new AtomicInteger(0);
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
<b>atomicIntegerCounter.incrementAndGet();</b>
}
}, 0);

这么做确实可行,但代价实在太大了吧?本来是个很简单的问题,但却被搞成这么复杂:导入了线程相关的类,同时使用这段代码的用户也需要注意线程问题。
现在,看看如何通过 Groovy 解决这个问题吧:

复制代码
int counter = 0
Timer timer = new Timer()
timer.schedule(new TimerTask() {
void run() {
<b>counter += 1 </b>
}
}, 0)

代码的运行结果与预期一致,没有编译错误,最重要的是这段代码的可读性非常好:其意图是非常清晰的。

新版 Groovy 也支持内部类。推荐的做法是如果非要使用内部类的话,请使用静态内部类。在内部类中访问外部变量的方式与 Java 略有不同。在 Java 中,内部类可以通过一个隐式引用来访问外部类,该引用是作为构造方法的参数传进去的。这里所说的是实现细节了,我们可以直接访问外部类中的变量,就好像这些变量定义在内部类中一样。在 Groovy 中,我们必须显式传递该引用,但却无须编写上面所说的构造方法,当在外部类中实例化内部类时尽管使用该构造方法就行了。

Groovy 注解的使用范围比 Java 还要广。在 Java 5 注解出来时 Groovy 就已经提供了对注解的支持,而 Groovy 1.7 则将这一支持发扬光大:可以对 import 语句、package 声明及变量声明进行注解。

在 import 语句上放置注解可能没什么用,除非使用 Grape(Groovy Adaptable Packaging Engine 或是 Groovy Advanced Packaging Engine)。Grape 好比一个增强的、 Maven Ivy 的代码级实现。其他的构建系统都会将依赖放置到外部的构建文件中(比如 Maven 的 pom.xml 或是 Ant 的 build.xml),而借助于 Grape 则可以通过依赖注解代码。这么做会触发系统下载依赖文件,同时使代码的构建更具可读性。在 Groovy 的旧版本中,注解处于一种很尴尬的地位:Groovy 注解只能用在 Java 5 注解可以使用的地方(比如说类或是方法)而不是更加自然的地方(比如在 import 语句上)。

此次更新包含了更具表达力的断言、借助于语言本身抽象语法树(AST)所实现的编译期元编程特性(这样 Java 中通过字节码程序库所实现的功能也能在 Groovy 中实现了),同时还更新了 Groovy Sql 类以支持批更新和事务。

Grails 1.2 也随着 Groovy 1.7 一同发布。Grails 是个 Web 框架,使用 Groovy 语言并基于现有流行的开源组件如 Spring MVC 和 Hibernate 所创建出来的快速开发环境,其风格类似于 Ruby on Rails。最近几年 Grails 得到了迅猛的发展。最新发布的 Grails 首次尝到了 SpringSource、Tomcat 和 SpringSource Tool Suite 团队通力合作所带来的好处。

新版 Grails 具有如下主要特性:与 Spring 的集成更加紧密(包括使用 Spring MVC @Controller 注解)、Groovy Object Relational Mapping(即 GORM,构建在 Hibernate 之上的 ORM 解决方案)工具对具名查询的支持、可插拔的 Web 容器(对 Jetty 与 Tomcat 开箱即用的支持)、Grails 视图层技术(Groovy Server Pages)改进的性能与内存使用量。发布声明提到其吞吐量提高了2——3 倍。Grails 也支持依赖管理而无论使用的Groovy 版本是什么,通过Ivy 机制自动下载依赖。该支持是借助于DSL(进行依赖声明)实现的。

InfoQ 曾采访过Groovy 与Grails 领导Guillaume Laforge 和Graeme Rocher 以了解Groovy 1.7 及Grails1.2 的相关信息。

Groovy 语言及周边的生态系统从 2008 年 SpringSource 收购 G2One 这一事件中获益良多。虽然语言背后的发展动力始终保持在稳定的状态,但工具支持这一块还是空白,尤其是 Eclipse 缺乏对 Groovy 的支持。 Groovy Eclipse IDE 2.0 的发布改变了这一切。虽然该工具套件还不支持最近发布的 Groovy1.7 编译器版本,但它已经提供了调试功能且兼容于 Eclipse3.5。现在,插件已经能够提供响应迅速的内容辅助特性,支持联合编辑(比如可以在 Groovy 项目中编写 Java 代码)机制、跨语言的重构等等。所有这些新特性几乎都建立在完全重写的 Eclipse 插件的基础之上。请查看SpringSource 发布声明以了解关于此次发布的更多信息。

查看英文原文: Groovy 1.7, Grails 1.2 and Groovy Eclipse 2.0 Updates Include Dependency Management,Language Support

2010-01-28 12:062984
用户头像

发布了 88 篇内容, 共 262.4 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

【架构笔记1】剃刀思维-如无必要,勿增实体

文思源想

软件架构设计 文思架构笔记 设计感悟

远超 IVF_FLAT、HNSW,ScaNN 索引算法赢在哪?

Zilliz

Milvus scann fastscan

Tapdata 正式登陆 Google Cloud Marketplace,面向全球用户提供专业的实时数据服务

tapdata

数据转换 数据同步工具

这个酸爽的过程,只有我们自己知道

开放签开源电子签章

开源 电子合同 电子签章

已解决org.springframework.dao.ConcurrencyFailureException并发失败异常的正确解决方法,亲测有效!!!

小明Java问道之路

思维导图真有效?亲测5款好用的AI思维导图软件!

彭宏豪95

思维导图 在线白板 协同办公 AIGC 效率软件

高防游戏服务器的优势:为玩家提供流畅安全的游戏环境

一只扑棱蛾子

游戏服务器 高防服务器 高防游戏服务器

Kubernetes与低代码:构建现代化应用的完美组合

不在线第一只蜗牛

Kubernetes 低代码 项目开发

低代码开发如何助力企业实现员工赋能

快乐非自愿限量之名

低代码 项目开发 企业赋能

英特尔边缘平台亮相MWC 2024,模块化设计引领行业创新

E科讯

一款高温型霍尔效应传感器

梦笔生花

一端开发、多端部署,多操作系统”争艳“背景下的开发思路

Speedoooo

混合开发 多端能力服务统一 混合开发框架 Hybird App

敏捷开发最佳实践:工具维度实践案例之落地工具提升研发质量

爱吃小舅的鱼

敏捷 敏捷开发

谷歌发布世界模型,能生成可交互虚拟世界;华为发布全球首个 5.5G 智能核心网丨 RTE 开发者日报 Vol.152

声网

如何使用ETLCloud拉通金蝶云

RestCloud

数据同步 ETL 金蝶云

内置AI加速器,第五代英特尔至强打造更可靠性能和更出色能效

E科讯

释放创新潜能!英特尔携广泛生态伙伴赋能5G核心网

E科讯

如何通过快速且安全的API基础设施策略为工程师赋能并提升效率,同时避免影子IT

Gingxing

kong API网关 Kong 网关 消息网关 Kong Gateway

PHP“牵手”淘宝代采系统,跨境淘宝代买系统

tbapi

淘宝代购系统 淘宝代购集运系统 淘宝代采系统 海外代购系统 跨境外贸系统

什么是数据同步利器DataX,如何使用?

快乐非自愿限量之名

大数据 数据同步

JavaScript 的新数组分组方法

伤感汤姆布利柏

科技创新引领零售商品部降本增效的未来

第七在线

GitHub 斩获 8300 星,小红书爆火开源 InstantID 要开直播了!

小红书技术REDtech

开源 AI AIGC AI写真 instantID

Groovy综述:Groovy 1.7、Grails 1.2及Groovy Eclipse 2.0,增强的依赖管理与语言支持_Java_Josh Long_InfoQ精选文章