【问题标题】:How java test conditions [duplicate]java如何测试条件[重复]
【发布时间】:2015-12-20 21:35:02
【问题描述】:

如果第一个条件为真,java 是否计算 (test1 || test2) 中的第二个条件?

我使用 Optional 并且我有类似的东西:

if (!opt.isPresent() || opt.get() == currentPlayer.getSelectedRegion())

如果第一个测试为真,java 计算第二个测试,就会出现问题。

【问题讨论】:

标签: java boolean conditional-statements


【解决方案1】:

如果第一个条件为真,java 是否计算 (test1 || test2) 中的第二个条件?

没有。布尔值或将短路,第一个true 足以使表达式true。之后将不再评估其他条件。

【讨论】:

    【解决方案2】:

    如果第一个条件为真,则不评估第二个条件。

    如果第一个条件为假,则评估第二个条件。

    这就是为什么你可以在没有NullPointerException的情况下编写如下代码

    if (str == null || str.length() == 0) {
         // do something
    }
    

    运算符|(而不是||)将评估这两个条件

    所以代码

    if (str == null | str.length() == 0) {
         // do something
    }
    

    如果strnull,则可以生成NullPointerException

    【讨论】:

      【解决方案3】:

      不,java 快捷操作符,如果第一个参数是,则不计算第二个参数。更正式的:

      • 对于x || y,仅当xfalse 时才评估y;和
      • 对于x && y,仅当ytrue 时才评估x

      这将提高性能,既有用又棘手:

      • 有用:防止你做一些会引发错误的事情。最典型的例子是null检查:

        if(x != null && x.someTest())
        

        如果xnull,这将防止.someTest 被调用。

      • 棘手:如果您调用的方法不仅返回某些内容,而且还会更改状态,则可能会出现问题。例如:

        public class Foo {
            private int checked = 0;
        
            bool someCondition () {
                return (checked % 2) == 0;
            }
        
            bool neverChecked () {
                checked++;
                return checked == 1;
            }
        }
        

        如果你现在打电话:

        if(foo.someCondition() || foo.neverChecked());
        

        这是建议将“getter”(认为计算对象的事物)和“setter”(修改对象状态的事物)明确分开的主要原因之一。从你开始混音的那一刻起,在某些情况下你的行为就会变得复杂。

      这可能是您始终递增checked 的意图,但只有当.someCondition 恰好是false 时才会递增。

      【讨论】:

        【解决方案4】:

        如果您使用||&&,而不是|&,Java 将不会费心计算右手操作数。

        【讨论】:

          猜你喜欢
          • 2017-04-12
          • 2013-02-04
          • 1970-01-01
          • 2010-10-01
          • 2016-12-07
          • 1970-01-01
          • 2016-08-17
          • 2016-07-05
          • 1970-01-01
          相关资源
          最近更新 更多