实战 Groovy: @Delegate 注释
2009-09-28 00:00:00 来源:WEB开发网Scott Davis 将继续有关 Groovy 元编程的讨论,这一次他将深入研究 @Delegate 注释,@Delegate 注释模糊了数据类型和行为以及静态和动态类型之间的区别。
在过去几期 实战 Groovy 文章中,您已经了解了闭包和元编程之类的 Groovy 语言特性如何将动态功能添加到 Java™ 开发中。本文提供了更多这方面的内容。您将看到 @Delegate 注释如何演变自 ExpandoMetaClass 使用的 delegate。您将再一次领略到 Groovy 的动态功能如何使它成为单元测试的理想语言。
在 “使用闭包、ExpandoMetaClass 和类别进行元编程” 一文中,您了解了 delegate 的概念。当将一个 shout() 方法添加到 java.lang.String 的 ExpandoMetaClass 中时,您使用 delegate 来表示两个类之间的关系,如清单 1 所示:
清单 1. 使用 delegate 访问 String.toUpperCase()
String.metaClass.shout = {->
return delegate.toUpperCase()
}
println "Hello MetaProgramming".shout()
//output
HELLO METAPROGRAMMING
您不能表示为 this.toUpperCase(),因为 ExpandoMetaClass 并未包含 toUpperCase() 方法。类似地,也不能表示为 super.toUpperCase(),因为 ExpandoMetaClass 没有扩展 String。(事实上,它不可能扩展 String,因为 String 是一个 final 类)。Java 语言并不具备用于表示这两个类之间的共生关系的词汇。这就是为什么 Groovy 要引入 delegate 概念。
在 Groovy 1.6 中,@Delegate 注释被添加到该语言中。该注释允许您向任意 类添加一个或多个委托 — 而不仅仅是 ExpandoMetaClass。
要充分地认识到 @Delegate 注释的威力,考虑 Java 编程中一个常见但复杂的任务:在 final 类的基础上创建一个新类。
- ››Groovy轻松入门
- ››实战:企业使用交换机VLAN路由配置
- ››实战案例分析:高质量软文对网站百度排名的影响
- ››实战经验浅谈网站搬家后的优化工作
- ››实战Active Directory站点部署与管理,Active Dir...
- ››实战操作主机角色转移,Active Directory系列之十...
- ››实战经验:巧用微博推广淘宝网店
- ››实战iPhone GPS定位系统
- ››实战Linux环境配置DBD:Oracle模块
- ››实战DeviceIoControl系列之一:通过API访问设备驱...
- ››实战DeviceIoControl系列之二:获取软盘/硬盘/光盘...
- ››实战DeviceIoControl系列之三:制作磁盘镜像文件
更多精彩
赞助商链接