WEB开发网
开发学院软件开发Java 实战 Groovy: 使用闭包、ExpandoMetaClass 和类别... 阅读

实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 注意,我再也不关心文件是否存在于文件系统中,实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程(7),我可以将它发送给这个单元测试中的其他类,并且它表现得像一个真正的文件,什么时候应该选择 Category 而不是 EMC?EMC 允许您将方法添加到某个类的单一实

注意,我再也不关心文件是否存在于文件系统中。我可以将它发送给这个单元测试中的其他类,并且它表现得像一个真正的文件。当 f 变量在测试结束时超出范围之后,还会执行定制行为。

尽管 ExpandoMetaClass 十分强大,但是 Groovy 提供了另一种元编程方法,使用了它独有的一组功能:类别(category)。

类别和 use 块

解释 Category 的最佳方法就是了解它的实际运行。清单 14 演示了使用 Category 来将 shout() 方法添加到 String:


清单 14. 使用一个 Category 进行元编程
class MetaTest extends GroovyTestCase{ 
 void testCategory(){ 
  String message = "Hello" 
  use(StringHelper){ 
   assertEquals "HELLO", message.shout() 
   assertEquals "GOODBYE", "goodbye".shout() 
  } 
 
  shouldFail{ 
   message.shout() 
   "foo".shout() 
  } 
 } 
} 
 
class StringHelper{ 
 static String shout(String self){ 
  return self.toUpperCase() 
 } 
} 

如果曾经从事过 Objective-C 开发,那么应当对这个技巧感到熟悉。StringHelperCategory 是一个普通类 — 它不需要扩展特定的父类或实现特殊的接口。要向类型为 T 的特定类添加新方法,只需定义一个静态方法,它接受类型 T 作为第一个参数。由于 shout() 是一个接受 String 作为第一个参数的静态方法,因此所有封装到 use 块中的 String 都获得了一个 shout() 方法。

那么,什么时候应该选择 Category 而不是 EMC?EMC 允许您将方法添加到某个类的单一实例或所有实例中。可以看到,定义 Category 允许您将方法添加到特定 实例中 — 只限于 use 块内部的实例。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:实战 Groovy 使用

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