我必须在500行的高级搜索方法中进行重构。我使用小部件中的闭包来拆分此方法,现在我有很多闭包但我想动态调用它们。
例如:
def listCriteria={ ... }
def textCriteria={ ... }
def booleanCriteria={ ... }
criteria.listDistinct {
criteries.eachWithIndex { crit, i->
def criteriaType="${crit.type}Criteria"
...
}
}
我该怎么做?
答案 0 :(得分:0)
使用方法,您可以从以下字符串动态调用此方法:
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()
}
不太好 - 但应该有用。
答案 1 :(得分:0)
闭包对于确定范围很有用。那么使用地图呢?
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
}
}