SonarLint 在此处使用原始布尔表达式

2022-09-04 01:28:24

我有以下类属性:

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究竟希望我在这里做什么?问题出在哪里?


答案 1

正如其他已经提到的,Sonar希望你确保你没有任何空指针异常,或者至少这是我在尝试验证变量之前进行检查时所看到的:

如果我有下一个,声纳抱怨

if (properties.getEnabled()) {
       // Your code
}

但是,如果我添加一个针对空值的快速验证,Sonar就会停止抱怨它

if (properties.getEnabled() != null && properties.getEnabled()) {
       // Your code
}

现在,正如你所提到的,你可以使用布尔类来使用下一个

Boolean.TRUE.equals(properties.getEnabled());

if (Boolean.TRUE.equals(properties.getEnabled())){
       // Your code
}

这听起来好像Java太冗长了,但是在内部,他们检查对象是否是实例布尔值,因此他们放弃了为null的可能性,如下所述:在调用exactionof之前是否需要进行空检查?

你可以从 git 存储库中检查它被接受了什么,什么不被接受:

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/test/files/checks/BoxedBooleanExpressionsCheck.java


答案 2

使用 org.apache.commons.lang3.BooleanUtils,这是一种空安全的方式:

if (BooleanUtils.isNotTrue(properties.getEnabled())) {
    return true;
}

推荐