是否可以使用一个类别来“引导”一堆相关的类别?

时间:2012-02-08 00:25:17

标签: groovy categories

我有一个类别类,我希望“使用”作用于第三方服务类。服务类有一堆xxxRequest和xxxResponse类以及每个xxx调用的数据的附加子类。

我希望在应用服务类别的同时自动将类别应用于每个其他类,具有相同的范围。

我可以在use块中列出所有类别类,但是有很多,我不想公开那些细节。基类不受我控制,所以我不能使用@ category / @ mixin。

目前我的服务类别中有一个静态初始化方法,它执行一系列mixin调用(以及添加奇怪的额外构造函数)。这可行,但不提供我想要的范围。

我错过了一种更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

我不确定我明白你要做什么。如果您在同一个代码块中同时尝试use多个类别,但您不想在每次要使用它们时列出所有这些类别(如果不是您的意思,请纠正我) ,您可以将长use放在一个方法中,该方法将一段代码(一个Closure)作为参数,然后使用该方法而不是长use。类似的东西:

@Category(String)
class ShoutCategory {
    def shout() {
        this.toUpperCase() + '!'
    }
}

@Category(Integer)
class ToEnglishCategory {
    def toEnglish() {
        // Only works for integers in 0..5 for now...
        ['zero', 'one', 'two', 'three', 'four', 'five'][this]
    }
}

def useAwesomeExtensions(Closure cl) {
    use (ShoutCategory, ToEnglishCategory) {
        cl()
    }
}

useAwesomeExtensions {
    // Here we can do all sorts of magic things.
    println 3.toEnglish().shout() // Outputs "THREE!"
}

// "hello".shout() -> Would throw a MissingMethodException here

在这个愚蠢的例子中,String和Integer类将是你想要扩充的类,但你没有访问权,而useAwesomeExtensions就像一个包含许多其他类别的大类。希望有所帮助:)