对于监控系统,我需要评估由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可以更复杂):
if (webservice is unavailable) and (there are no emails about planned downtime)
如果可能的话,我想在这里使用短路评估,这样如果 web 服务可用(并且第一个条件是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
而不是Eval
- 将
check()
方法更改为字段并应用@Lazy
转换 - 更改
${new WebserviceDownCheck().check()}
为${ -> new WebserviceDownCheck().check()}
(在这里看到)
似乎我需要一些惰性机制来允许我GString
在Eval
(或GroovyShell
)已经执行它时进行初始化。也许像 lazy Binding
for之类的东西GroovyShell
。
我想知道,不编写自定义字符串评估逻辑是否有可能?