对于监视系统,我需要计算由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可能更复杂):
if (webservice is unavailable) and (there are no emails about planned downtime)如果可能的话,我想在这里使用短路评估,这样如果webservice可用(第一个条件是false),那么第二个部分就不会被评估,因为总体结果将是false。因此,当没有必要时,我可以避免连接到邮件服务器(和其他耗时的操作)。
下面是我正在努力实现的一个例子:
class WebserviceDownCheck {
boolean check() {
println 'Checking webservice'
return false
}
}
class NoDowntimeEmailCheck {
boolean check() { //shouldn't be executed
println 'Checking emails'
return true
}
}
//using string evaluation, because conditions are constructed during runtime
Eval.me("${new WebserviceDownCheck().check()} && ${new NoDowntimeEmailCheck().check()}")产出如下:
Checking webservice
Checking emails //shouldn't be there
Result: false不应该执行NoDowntimeEmailCheck().check(),因为第一个条件已经是false。我试过:
GroovyShell而不是Evalcheck()方法转换为字段并应用@Lazy转换${new WebserviceDownCheck().check()}更改为${ -> new WebserviceDownCheck().check()} (查看它为这里)似乎我需要一些懒惰的机制来初始化GString,而Eval (或GroovyShell)已经在执行它了。也许类似于懒惰的Binding for GroovyShell。
我想知道,在不编写自定义字符串计算逻辑的情况下,是否有可能发生这种情况?
发布于 2014-06-23 18:57:17
将其组合成一个表达式,如下所示:
Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")如果结果是假的,只会对第一个进行评估。
https://stackoverflow.com/questions/24371589
复制相似问题