Grails groovy闭包的动态引用
我必须用500行的高级搜索方法进行重构。我使用闭包将此方法拆分为几个小部分,现在我有很多闭包,但我希望动态调用它们 例如:Grails groovy闭包的动态引用,grails,groovy,closures,Grails,Groovy,Closures,我必须用500行的高级搜索方法进行重构。我使用闭包将此方法拆分为几个小部分,现在我有很多闭包,但我希望动态调用它们 例如: def listCriteria={ ... } def textCriteria={ ... } def booleanCriteria={ ... } criteria.listDistinct { criteries.eachWithIndex { crit, i-> def criteriaType="${crit.type}Crit
def listCriteria={ ... }
def textCriteria={ ... }
def booleanCriteria={ ... }
criteria.listDistinct {
criteries.eachWithIndex { crit, i->
def criteriaType="${crit.type}Criteria"
...
}
}
如何才能做到这一点?使用方法,您可以从如下字符串动态调用此方法:
def listCriteria() {"list"}
def textCriteria() {"text"}
def string1 = "list"
def string2 = "text"
assert "${string1}Criteria"() == "list"
assert "${string2}Criteria"() == "text"
编辑:
我不知道一种优雅的方法来获取闭包的动态引用
您可以使用控制器类的properties
属性来查找所有闭包并调用它们
def allClosures = this.properties.findAll{Closure.isAssignableFrom(it.value.getClass())}
def callCriteriaClosureByName(name) {
def criteriaClosure = allClosures.find{it.key == "${name}Criteria"}.value
if(criteriaClosure)
criteriaClosure()
}
不是很好,但是应该可以工作。闭包有利于确定范围。使用地图怎么样
class Criteria {
def listDistinct(closure) {
closure()
}
}
closures = [
listCriteria : { "list" },
textCriteria : { "text" },
booleanCriteria : { "boolean" }
]
def criteries = ["list", "text", "boolean"]
def criteria = new Criteria()
criteria.listDistinct {
criteries.eachWithIndex { crit, index ->
def criteriaType=closures["${crit}Criteria"]
assert criteriaType instanceof Closure
}
}
你真的需要闭包吗?或者你也可以使用纯方法吗?我需要建立一个大的标准,现在这个方法有500行,我不需要;我不想用hql重写它,因为风险很高。我同意你的看法,但是如果我想把它委托给另一个闭包,我该怎么做,因为我使用的是内部闭包和内部闭包?