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

2022-09-04 05:53:16

假设我有这样的代码:

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

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

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

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

事后分析:

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

答案 1

为了禁用短路,请使用单个“&”或“|”而不是两个:

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

答案 2

单曲和建议非常好- 解释为什么它有效:

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

此调用对方法返回的值使用 Logic And。它知道,如果任何结果是假的,那么最终的结果是假的,所以它可以立即返回。“惰性求值”是一种标准的计算优化,以避免执行不需要的处理。

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

这是用算术运算符(按位运算符)替换逻辑运算。如果这是在整数上工作的,那么它将把整数的所有单个位放在一起。对于布尔值,虽然只有真值或假值,但它仍然作为算术表达式进行计算,因此计算表达式的所有部分。and

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


推荐