我有一个类别类,我希望“使用”作用于第三方服务类。服务类有一堆xxxRequest和xxxResponse类以及每个xxx调用的数据的附加子类。
我希望在应用服务类别的同时自动将类别应用于每个其他类,具有相同的范围。
我可以在use块中列出所有类别类,但是有很多,我不想公开那些细节。基类不受我控制,所以我不能使用@ category / @ mixin。
目前我的服务类别中有一个静态初始化方法,它执行一系列mixin调用(以及添加奇怪的额外构造函数)。这可行,但不提供我想要的范围。
我错过了一种更简单的方法吗?
答案 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
就像一个包含许多其他类别的大类。希望有所帮助:)