如何比较布尔?
以此为例(摘自Java正则表达式检查器不起作用):
while(!checker) {
matcher = pattern.matcher(number);
if(matcher.find())
checker = true;
else
year++;
}
如果使用.equals(false)
来检查Boolean checker
的值,它会影响吗?
我知道这有些相似。 然而,显然这个问题涉及原始boolean
而不是对象包装器, Boolean
; 因此.equals()
将不适用。
另外, Boolean
应该处理不同于boolean
?
从您的评论中,您似乎在寻找使用Boolean
包装类的“最佳实践”。 但是,实际上没有任何最佳实践,因为使用这个类开始是一个坏主意。 使用对象包装器的唯一原因是在绝对必须的情况下(例如使用泛型时,即在HashMap<String, Boolean>
等中存储boolean
)。 使用对象包装没有好处,并且有很多缺点,最值得注意的是它会让你打开NullPointerException
。
如果'!'有关系吗? 用于布尔值而不是.equals()?
这两种技术都容易受到NullPointerException
,所以在这方面并不重要。 在第一种情况下, Boolean
将被取消装箱到相应的boolean
值中,并与正常情况进行比较。 在第二种情况下,您从Boolean
类调用一个方法,如下所示:
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
无论哪种方式,结果都是一样的。
如果使用.equals(false)来检查布尔检查器的值,它会影响吗?
根据以上,没有。
次要问题:布尔值是否应该与布尔值不同?
如果您绝对必须使用Boolean
类,请在执行任何比较之前始终检查为null
。 例如,
Map<String, Boolean> map = new HashMap<String, Boolean>();
//...stuff to populate the Map
Boolean value = map.get("someKey");
if(value != null && value) {
//do stuff
}
这将工作,因为Java短路条件评估。 您也可以使用三元运算符。
boolean easyToUseValue = value != null ? value : false;
但认真......只是使用原始类型,除非你被迫不去。
尝试这个:
if (Boolean.TRUE.equals(yourValue)) { ... }
作为额外的好处,这是无效的。
只要checker
不为null
,您可以使用!checker
发布。 从Java 5开始,这是可能的,因为这个Boolean
变量将被自动装箱到primivite boolean
值。