有没有办法在Java中禁用短路评估?

时间:2013-12-06 11:31:22

标签: java semantics boolean-logic

说我有这样的代码:

boolean ret = a() && b() && c() && d() && e();

通常只有在所有其他调用a() - d()返回true时才调用e()。是否有一些编译器或JVM选项可以禁用短路评估,因此无论其他函数的结果如何,都会调用e()?

基本上我正在做大型系统的UAT并且需要测试e(),但是设置环境和场景以确保所有a(),b()等返回true是非常痛苦的......

编辑:好吧,我想使用位AND而不是逻辑可以提供某种解决方法,但理想情况下我正在寻找一种不需要在源代码中进行任何更改的解决方案。两者都是由于正式和技术原因(正如我提到的系统很大,我们有整个过程,在暂存区域和签署之间推广和部署代码)。这仅用于测试,生产版本需要启用延迟评估(即使用&&)

验尸:

  • “正确”答案是:不,没有。
  • “有用”答案:你可以改变&&到&
  • “我到底做了什么”回答:远程调试系统,在表达式上放置断点并告诉eclipse运行e()-_-

3 个答案:

答案 0 :(得分:19)

为了禁用短路使用单'&'或'|'而不是两个:

boolean ret = a() & b() & c() & d() & e();

答案 1 :(得分:14)

单身&建议非常好 - 解释它的工作原理:

boolean ret = a() && b() && c() && d() && e();

此调用使用Logical And对方法返回的值。它知道如果任何结果为false,则最终结果为false,因此它可以立即返回。 “懒惰评估”是一种标准的计算优化,可以避免进行不必要的处理。

boolean ret = a() & b() & c() & d() & e();

这是用算术运算替换逻辑运算 - 按位运算符。如果这对整数有效,那么它将and整数的所有单个位组合在一起。在布尔值的情况下,虽然只有true或false值,但它仍然被评估为算术表达式,因此表达式的所有部分都被评估。

所以对于布尔值&和&&给出相同的逻辑结果,但它们在内部以不同的方式处理,这恰好给出了您正在寻找的行为。

答案 2 :(得分:3)

没有用于更改布尔表达式求值的语义的编译器或JVM选项。

如果您无法修改来源,可能(尽管不能保证)选项包括:

  • 通过精心设计,创造性地重新创建您想要测试的条件 设置先决条件。
  • 使用模拟对象。
  • 破解编译器。
  • 破解JVM。
  • 旋转字节码。

很抱歉,这些比编译器/ JVM选项或修改源要困难得多。此外,最后三个选项(以及请求的编译器/ JVM选项或修改源)违反了不修改测试内容的正确测试协议。