首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在由Eval或GroovyShell执行时延迟的GroovyShell计算

在由Eval或GroovyShell执行时延迟的GroovyShell计算
EN

Stack Overflow用户
提问于 2014-06-23 17:13:22
回答 1查看 686关注 0票数 3

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

代码语言:javascript
复制
if (webservice is unavailable) and (there are no emails about planned downtime)

如果可能的话,我想在这里使用短路评估,这样如果webservice可用(第一个条件是false),那么第二个部分就不会被评估,因为总体结果将是false。因此,当没有必要时,我可以避免连接到邮件服务器(和其他耗时的操作)。

下面是我正在努力实现的一个例子:

代码语言:javascript
复制
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()}")

产出如下:

代码语言:javascript
复制
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)已经在执行它了。也许类似于懒惰的Binding for GroovyShell

我想知道,在不编写自定义字符串计算逻辑的情况下,是否有可能发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-23 18:57:17

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

代码语言:javascript
复制
Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")

如果结果是假的,只会对第一个进行评估。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24371589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档