首页 文章

由Eval或GroovyShell执行时的惰性GString评估

提问于
浏览
3

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

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

似乎我需要一些惰性机制,这将允许我初始化 GStringEval (或 GroovyShell )已经在执行它 . 也许像 GroovyShell 这样懒惰的 Binding .

我想知道,如果没有编写自定义字符串评估逻辑,它是否可行?

1 回答

  • 3

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

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

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

相关问题