写点什么

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:063120
用户头像

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

关注

评论

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

英特尔成为openEuler社区黄金捐赠人,共建最具创新的开源社区

彭飞

大模型应用产品「归一妙计」亮相,AI Agent落地广告投放场景

武凯说

人工智能 领域模型 GPT 营销自动化 全媒体广告投放代理、

MongoDB与大数据处理:构建高性能分布式数据库

互联网工科生

mongodb 非关系型数据库

SD-WAN网络的可扩展性解析

Ogcloud

网络 SD-WAN 组网

Pipeline 助您轻松驾驭海量数据!

观测云

数据分析 日志 pipeline

活动 | Mint Blockchain 赞助支持清迈 WAMOTOPIA 线下活动

NFT Research

blockchain NFT L2

面试官问我:线程锁导致的kafka客户端超时,如何解决?

华为云开发者联盟

开发 华为云 华为云开发者联盟 线程锁

武汉 Linux 爱好者线下沙龙:WHLUG 2023 收官!不容错过!

nn-30

Linux 技术交流 线下沙龙 WHLUG LUG

软件测试/测试开发|详解selenium xpath定位

霍格沃兹测试开发学社

第五代英特尔至强可扩展处理器AI性能大幅提升,英特尔加注推动人工智能无处不在

E科讯

大数据服务与低代码开发:赋能创新与效率的双剑合璧

不在线第一只蜗牛

大数据 软件开发 低代码

1688商品API在跨境电商中的应用场景

技术冰糖葫芦

API

有道基于 Amoro Mixed Format 构建准实时湖仓实践

Amoro Community

大数据 开源 湖仓一体 有道 实时湖仓

软件测试/测试开发|GitHub怎么用,这篇文章告诉你

霍格沃兹测试开发学社

软件测试/测试开发|最容易上手的Ubuntu虚拟机安装教程

霍格沃兹测试开发学社

文心一言 VS 讯飞星火 VS chatgpt (159)-- 算法导论12.3 6题

福大大架构师每日一题

福大大架构师每日一题

迈向AI+API经济的智能时代

幂简集成

人工智能 AI API

简述SD-WAN组网的五大技术优势

Ogcloud

网络 网络加速 SD-WAN 组网

演讲回顾:半导体设计中的数字资产管理最佳实践

龙智—DevSecOps解决方案

数字资产管理

整体模块化区块链技术引领区块链大规模采用

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

大模型时代,未来所有公司都是 Data+AI 公司

Kyligence

人工智能 数据分析

SD-WAN优化远程办公网络体验

Ogcloud

远程办公 网络 SD-WAN 组网

企业场景中大语言模型的应用实践探索丨Fabarta 技术专栏

Fabarta

大模型 数据基础设施 多模态大模型 大模型应用开发

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