if-else条件:和评估之谜

时间:2014-02-10 12:51:59

标签: java android if-statement

我正在开发适用于Android的应用。在我的代码中,我有以下几行:

if (shape != null && !created && isTap(touchDown, event)) {
    DrawPrimitive newShape = listener.onTouch(event, shape);
    if (newShape != shape)
        canvas.onDrawingChanged(true);
}

created是一个布尔成员。我想知道因为created是真的但运行时步入我的if甚至没有调用isTap方法。如果我换了!对于虚假的比较,一切正常。

if (shape != null && created == false && isTap(touchDown, event)) {
    DrawPrimitive newShape = listener.onTouch(event, shape);
    if (newShape != shape)
        canvas.onDrawingChanged(true);
}

所以我想知道是不是!不被允许。但即便如此,为什么我的isTap方法(在版本1中)没有被调用,为什么在不评估所有AND条件的情况下执行内部代码。

2 个答案:

答案 0 :(得分:2)

为什么isTap()没有被调用:&&连词(和||分离)从左到右进行短路评估:左边的操作数为表达式的计算结果为falsetrue||),右侧操作数不需要进行评估:表达式的值已知。

如果!createdcreated == false

createdboolean在Java中是相同的。如果是Boolean,您将遇到自动装箱/拆箱问题:

  • !created自动将Boolean发送至boolean并使用!补充结果。

  • created == false autoboxes false boolean literal to Boolean并比较对象引用。它们不一定是相同的Boolean个对象。

为避免此类问题和经验法则,请勿在布尔表达式中直接使用truefalse

答案 1 :(得分:0)

!createdcreated == false是等效的。第一个版本的行为方式与第二个版本完全相同。