3

对于监控系统,我需要评估由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可以更复杂):

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()}(在这里看到)

似乎我需要一些惰性机制来允许我GStringEval(或GroovyShell)已经执行它时进行初始化。也许像 lazy Bindingfor之类的东西GroovyShell

我想知道,不编写自定义字符串评估逻辑是否有可能?

4

1 回答 1

3

将其组合成一个表达式,如下所示:

Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")

如果结果为假,则仅评估第一个。

于 2014-06-23T18:57:17.507 回答