我正在开发适用于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条件的情况下执行内部代码。
答案 0 :(得分:2)
为什么isTap()
没有被调用:&&
连词(和||
分离)从左到右进行短路评估:左边的操作数为表达式的计算结果为false
(true
为||
),右侧操作数不需要进行评估:表达式的值已知。
!created
为created == false
, created
和boolean
在Java中是相同的。如果是Boolean
,您将遇到自动装箱/拆箱问题:
!created
自动将Boolean
发送至boolean
并使用!
补充结果。
created == false
autoboxes false
boolean literal to Boolean
并比较对象引用。它们不一定是相同的Boolean
个对象。
为避免此类问题和经验法则,请勿在布尔表达式中直接使用true
或false
。
答案 1 :(得分:0)
!created
和created == false
是等效的。第一个版本的行为方式与第二个版本完全相同。