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

 陈珍家615971 发布于 2023-02-12 14:36

说我有这样的代码:

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

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

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

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

验尸报告:

"正确"答案是:不,没有.

"有用"答案:您可以将&&更改为&

"我到底做了什么"回答:远程调试系统,在表达式上放置断点并告诉eclipse运行e()-_-

amatellanes.. 19

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

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


Tim B.. 14

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

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

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

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

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

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

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

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

    2023-02-12 14:38 回答
  • 单一和建议非常好 - 解释它的工作原理:

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

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

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

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

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

    2023-02-12 14:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有