我只是想知道哪一个更快检查int值并将布尔值设置为正确值?
switch (type) {
case INCREASING:
if (currentVal >= duration) { done = true; }
break;
case DECREASING:
if (currentVal <= 0) { done = true; }
break;
default:
done = false;
break;
}
或
done = (type == INCREASING ? currentVal >= duration ? true : false : false) || (type == DECREASING ? currentVal <= 0 ? true : false : false);
带
public static final int INCREASING = 1;
public static final int DECREASING = -1;
private float currentVal;
private float duration; //is set in the constructur
private boolean done = false;
他们在我想用它实现的目标方面都做了同样的事情。我只是觉得switch语句可能会快一点,因为它不会检查所有内容? 我喜欢将它放在一条线上的优势,但实际上值得考虑的是差异吗?
答案 0 :(得分:9)
第三种选择:
done = (type == INCREASING && currentVal >= duration) ||
(type == DECREASING && currentVal <= 0);
我认为它在简洁性和可读性之间是一个很好的折衷方案。正如其他人所提到的那样,速度是无关紧要的(在最坏的情况下,你要进行四次整数比较和三次布尔比较),除非在你将这些代码投入生产之后,你会看到性能问题并能够确定这里存在瓶颈。
答案 1 :(得分:1)
速度应该没有重大差异。 但是,该开关更具可读性和可维护性。
答案 2 :(得分:1)
switch
语句通常使用等效的哈希码/等号(至少对于String
和Enum
)或其他情况的跳转表,以及您的代码:
done = ( type == INCREASING ?
currentVal >= duration ? true : false // A
: false) // B
|| ( type == DECREASING ?
currentVal <= 0 ? true : false // C
: false ) // D;
有一个懒惰的评价:
type == INCREASING => true
,请勿执行D. type == DECREASING => false
,请勿执行C. a || b
不执行b a && b
如果a为假,则不执行b 你应该这样写:
done = ( (type == INCREASING) ? currentVal >= duration : false) // B
|| ( (type == DECREASING) ? currentVal <= 0 : false ) // D;
然后:
done = (type == INCREASING && currentVal >= duration)
|| (type == DECREASING && currentVal <= 0);
我会坚持switch
或简单if
/ else
,如果它比上面的表达式更复杂,而不是使用远远不是三元运算符的叠加可读(我在第一个例子中使用了新行来使其更具可读性)。
答案 3 :(得分:1)
这不是“答案”;但只是一个观点无法适应评论。
我可能会这样写:
if (type == INCREASING && currentVal >= duration) {
done = true;
} else if (type == DECREASING && currentVal <= 0) {
done = true;
}
没有其他/ done = false
,因为如果清除它就像其他地方的问题一样。
另外,done = true
可能会更好地替换为break
或return
等。