对于监视系统,我需要评估由布尔表达式表示的自定义检查 . 例如,我有一个简单的伪代码条件(它们可能更复杂):
if (webservice is unavailable) and (there are no emails about planned downtime)
如果可能的话,我想在这里使用short-circuit evaluation,这样如果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
而不是Eval
-
将
check()
方法更改为字段并应用@Lazy
转换 -
将
${new WebserviceDownCheck().check()}
更改为${ -> new WebserviceDownCheck().check()}
(看到它here)
似乎我需要一些惰性机制,这将允许我初始化 GString
而 Eval
(或 GroovyShell
)已经在执行它 . 也许像 GroovyShell
这样懒惰的 Binding
.
我想知道,如果没有编写自定义字符串评估逻辑,它是否可行?
1 回答
将它组合成一个表达式,如下所示:
如果结果为假,则仅评估第一个 .