0

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

例如:

def listCriteria={ ... }
def textCriteria={ ... }
def booleanCriteria={ ... }

criteria.listDistinct {
    criteries.eachWithIndex { crit, i->
        def criteriaType="${crit.type}Criteria"
        ...
    }
}

我怎样才能做到这一点?

4

2 回答 2

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
    }
}
于 2013-09-05T16:29:22.737 回答
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()
}

不是那么好 - 但应该工作。

于 2013-09-05T07:34:10.473 回答