实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程
2009-11-19 00:00:00 来源:WEB开发网注意,我再也不关心文件是否存在于文件系统中。我可以将它发送给这个单元测试中的其他类,并且它表现得像一个真正的文件。当 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 块内部的实例。
更多精彩
赞助商链接