Grails groovy闭包的动态引用

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

我必须用500行的高级搜索方法进行重构。我使用闭包将此方法拆分为几个小部分,现在我有很多闭包,但我希望动态调用它们

例如:

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重写它,因为风险很高。我同意你的看法,但是如果我想把它委托给另一个闭包,我该怎么做,因为我使用的是内部闭包和内部闭包?