如何在Groovy中将两个相似方法合并为一个?能否用闭包实现?
用Groovy闭包优雅合并相似重试方法
当然可以用闭包实现优雅合并,核心思路是把两个方法中**可变的部分(获取值的逻辑、成功判断条件、提示文本)**抽成参数传入通用方法,固定的循环重试逻辑则复用。
重构后的通用方法
def waitUntil(def valueProvider, Closure<Boolean> conditionChecker, String waitMessage) { def satisfied = false while (!satisfied) { def currentValue = valueProvider.call() if (conditionChecker.call(currentValue)) { satisfied = true } else { println waitMessage sleep 15 } } }
替代原method1的调用
// 对应原来的method1 waitUntil({ getConnectionStatus() }, { status -> status == 200 }, "repeat until connection is 200")
替代原method2的调用
注意:原method2里在sleep后重复调用getResult()是多余的,下一次循环会重新执行获取逻辑,重构后自动避免了这个冗余操作:
// 对应原来的method2 waitUntil({ getResult() }, { result -> result in ["A", "B", "C"] }, "waiting until result is either A, B, or C")
逻辑说明
valueProvider:闭包,负责获取需要检查的目标值(比如调用getConnectionStatus()或getResult())conditionChecker:闭包,接收目标值,返回布尔值表示是否满足结束循环的条件waitMessage:字符串,循环等待时的提示文本
这种方式完全解耦了固定的重试逻辑和可变的业务判断,后续新增类似的重试场景,只需要传入不同的闭包和提示文本即可,不需要重复编写循环、等待的代码。
内容的提问来源于stack exchange,提问作者Chris Ragner
相关产品推荐
相关产品推荐

