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

有没有办法在Java中禁用短路评估?,java,semantics,boolean-logic,Java,Semantics,Boolean Logic,假设我有这样的代码: boolean ret = a() && b() && c() && d() && e(); 通常,只有当所有其他调用a()-d()返回true时,才会调用e()。是否有一些编译器或JVM选项可以禁用短路计算,因此无论其他函数的结果如何,都会调用e() 基本上,我正在做大型系统的UAT,需要测试e(),但是设置环境和场景以确保所有a()、b()等返回真值是非常痛苦的 编辑:好的,我想使用bit和而不是逻辑可以

假设我有这样的代码:

boolean ret = a() && b() && c() && d() && e();
通常,只有当所有其他调用a()-d()返回true时,才会调用e()。是否有一些编译器或JVM选项可以禁用短路计算,因此无论其他函数的结果如何,都会调用e()

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

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

验尸:

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

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

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

“单一建议和建议”非常好-请解释其工作原理:

boolean ret = a() && b() && c() && d() && e();
此调用对方法返回的值使用逻辑And。它知道,如果任何结果为假,那么最终结果为假,因此它可以立即返回“惰性评估”是一种标准的计算优化,以避免进行不必要的处理

boolean ret = a() & b() & c() & d() & e();
这是将逻辑运算替换为算术运算-按位运算符。如果这对整数有效,那么它将
整数的所有单个位放在一起。对于布尔值,虽然只有真值或假值,但它仍然作为算术表达式进行计算,因此表达式的所有部分都进行计算


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

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

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

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

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

只需使用单字符而不是双字符。呃!根据您的需要修改代码后,您没有要重新生成的编译器?@devnull:根据环境的不同,修复设置和重新运行测试可能需要相当长的时间,因此在第一次尝试时收集所有错误的先决条件可能是一个巨大的优势。。。这可能是非短路评估的少数几个好的用例之一。你为什么要这样做?如果你想测试e(),为什么不直接测试e(),完全脱离这个If条件呢实际上,我对这个设计总的来说有点怀疑。除此之外。。。为什么您不能单独测试
e()
,为什么您觉得需要这样做?出于测试目的,您应该设置一个场景,允许所有其他场景返回true。这可能涉及模拟对象或其他注入值,但您仍然应该找到一种方法来实现。请注意,暂时禁用您想要的逻辑意味着您没有测试部署到生产环境中的代码(因为此方法运行不同的代码)。