groovy 如何将两种相似的方法合二为一?

1l5u6lss  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(118)

我有两个相似的方法,但它们的检查条件不同。给予两个相似的方法,我怎样才能把这两个方法结合成一个呢?这对闭包来说是可能的吗?

def someCondition = false

def method1() {
    while(!someCondition) {
        def connectionStatus = getConnectionStatus() // return 200, 404, etc.
        if (connectionStatus == 200) {
            someCondition = true
        } else {
            println "repeat until connection is 200"
            sleep 15
        }
    }
}

def someCondition = false

def method2(){
    while(!someCondition) {
        def result = getResult() // A, B, C, etc. 
        if (result in ["A", "B", "C"]) {
            someCondition = true
        } else {
            println "waiting until result is either A, B, or C"
            sleep 15
            result = getResult() // call again to check if result changed
        }
    }
}

我可以试着把它变成一个方法,并有不同的情况,它根据不同的情况在不同的if条件下等待,但这和只使用两个不同的方法没有什么不同。在Groovy中有什么优雅的方法来解决这个问题吗?

ghg1uchk

ghg1uchk1#

您可以编写一个如下所示的方法,该方法接受一个Closure,如果成功则返回true

def waitUntil(int sleep = 1, int maxRetries = 10, Closure<Boolean> test) {
    int retries = 0
    while (retries++ < maxRetries && !test()) {
        println "Failed at attempt $retries/$maxRetries, sleeping for $sleep ms before retrying"
        Thread.sleep(sleep)
    }
}

那么,你可以这样称呼它:

waitUntil {
    getResult() in ["A", "B", "C"]
}

或使用以下选项延长休眠时间:

waitUntil(100) {
    getResult() in ["A", "B", "C"]
}

或者让它在重试之间休眠更长时间,并且只重试5次:

waitUntil(100, 5) {
    getResult() in ["A", "B", "C"]
}

你是这个意思吗?

编辑

正如所指出的,这在每次调用闭包时都会创建一个列表,因此对于长时间运行的快速循环任务,这可能(可能)会创建许多死对象供垃圾收集器拾取。
解决这个问题的一种方法是将预期值传递给main方法,并将其作为参数传递给闭包。
然后,我们只创建一个列表:

def waitUntil(expectedResult, int sleep = 1, int maxRetries = 10, Closure<Boolean> test) {
    int retries = 0
    while (retries++ < maxRetries && !test(expectedResult)) {
        println "Failed at attempt $retries/$maxRetries, sleeping for $sleep ms before retrying"
        Thread.sleep(sleep)
    }
}

waitUntil(["A", "B", "C"]) {
    getResult() in it
}

相关问题