WEB开发网
开发学院软件开发Java 实战 Groovy: @Delegate 注释 阅读

实战 Groovy: @Delegate 注释

 2009-09-28 00:00:00 来源:WEB开发网   
核心提示:Scott Davis 将继续有关 Groovy 元编程的讨论,这一次他将深入研究 @Delegate 注释,实战 Groovy: @Delegate 注释,@Delegate 注释模糊了数据类型和行为以及静态和动态类型之间的区别, 在过去几期 实战 Groovy 文章中,该注释允许您向任意 类添加一个或多个委托 &m

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 类的基础上创建一个新类。

1 2 3 4 5 6  下一页

Tags:实战 Groovy Delegate

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接