我有以下类属性:
class Properties {
private Boolean enabled;
public Boolean getEnabled() {
return enabled;
}
}
如果我编写下面的代码,SonarLint会在if条件上给我一个警告,说“在这里使用原始布尔表达式"。
if (!properties.getEnabled()) {
return true;
}
// more code
将if条件更改为下面的条件会关闭警告,但这样可读性较差,这不可能是SonarLint想要的,或者?
if (properties.getEnabled().equals(Boolean.FALSE)) {
return true;
}
// more code
SonarLint到底想让我在这里做什么?有什么问题?
5条答案
按热度按时间yftpprvb1#
正如其他已经提到的,Sonar希望您确保没有任何空指针异常,或者至少这是我在尝试验证变量之前进行空检查时看到的情况:
如果我有下一个代码,Sonar会发出警告,指出此代码可能引发空指针异常。
但如果我添加一个针对空值的快速验证,Sonar就不会再抱怨了:
现在,正如您提到的,您可以使用Boolean类来比较布尔值,如下面的代码所示:
你可以把它放在if语句中,就像下面的代码:
这看起来可能太冗长了,但是Boolean.TRUE.equals()的实现会检查对象是否是Boolean类的示例,并且null不能是任何类的示例,因为null不是示例,你可以在这里找到更好的解释:Is null check needed before calling instanceof?
他们曾经有一个非常好的和简单的测试集,以了解什么是接受的,什么是不是,我在这个答案中公布时,我第一次回答它,但它看起来像它不再存在的主人(我仍然添加它更容易理解,但这是一个旧版本的声纳,所以它应该只作为参考):https://github.com/SonarSource/sonar-java/blob/5.14.0.18788/java-checks/src/test/files/checks/BoxedBooleanExpressionsCheck.java
您也可以在此处参考此规则的实施代码:https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/BoxedBooleanExpressionsCheck.java#L131
yqlxgs2m2#
使用org.apache.commons.lang3.BooleanUtils,这是一种空值安全方法:
vu8f3i0k3#
这似乎有一个简单的答案:如果属性可以为空,那么getter的理智应该会有所帮助。
jljoyd4f4#
尝试.booleanValue(),就像这样if(properties.getEnabled().booleanValue()){ }希望它能帮助你。
bihw5rsg5#
试试这个: