有没有办法在Java中禁用短路评估?
说我有这样的代码:
boolean ret = a() && b() && c() && d() && e();
通常只有在所有其他调用a() – d()返回true时才调用e()。 是否有一些编译器或JVM选项可以禁用短路评估,因此无论其他function的结果如何,都会始终调用e()?
基本上我正在做大型系统的UAT并且需要测试e(),但是设置环境和场景以确保所有a(),b()等返回true是非常痛苦的…
编辑:好吧,我想使用位而不是逻辑可以提供某种解决方法,但理想情况下我正在寻找一个不需要在源代码中进行任何更改的解决方案。 两者都是由于正式和技术原因(正如我提到的系统很大,我们有整个过程,在暂存区域之间推广和部署代码并获得签字)。 这仅用于测试,生产版本需要启用延迟评估(即使用&&)
验尸报告:
- “正确”答案是:不,没有。
- “有用”答案:您可以将&&更改为&
- “我到底做了什么”回答:远程调试系统,在表达式上放置断点并告诉eclipse运行e()-_-
没有用于更改布尔表达式求值的语义的编译器或JVM选项。
如果您无法修改源,可能(尽管不能保证)选项包括:
- 通过精心设置前提条件,创造性地重新创建您想要测试的条件。
- 使用模拟对象。
- 破解编译器。
- 破解JVM。
- 旋转字节码。
对不起,这些比编译器/ JVM选项或修改源要困难得多。 此外,最后三个选项(以及请求的编译器/ JVM选项或修改源)违反了不修改正在测试的内容的正确测试协议。
为了禁用短路使用单’&’或’|’ 而不是两个:
boolean ret = a() & b() & c() & d() & e();
单一和建议非常好 – 解释它的工作原理:
boolean ret = a() && b() && c() && d() && e();
此调用使用Logical And对方法返回的值。 它知道如果任何结果为false,则最终结果为false,因此它可以立即返回。 “懒惰评估”是一种标准计算优化,可避免进行不需要的处理。
boolean ret = a() & b() & c() & d() & e();
这是用算术运算符替换逻辑运算 – 按位运算符。 如果这是在整数上工作那么它将and
整数的所有单独位一起。 在布尔值的情况下,虽然只有true或false值,但它仍然被评估为算术表达式,因此评估表达式的所有部分。
因此,对于布尔值&和&&给出相同的逻辑结果,但它们在内部进行不同的处理,这恰好给出了您正在寻找的行为。