SonarLint 在这里使用原始的布尔表达式

Posted

技术标签:

【中文标题】SonarLint 在这里使用原始的布尔表达式【英文标题】:SonarLint Use the primitive boolean expression here 【发布时间】:2020-03-20 22:38:58 【问题描述】:

我有以下类属性:

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 到底想让我在这里做什么?有什么问题?

【问题讨论】:

enabled 成为null 是什么意思? imgur.com/gallery/80Indtp 也许将您的 enabled 属性声明为原始布尔值。我认为 Sonarlint 试图防止空指针异常 @D.Lawrence 确实,在使警告静音之前进行空检查。一个有用的警告,但一个非常混乱的消息。谢谢 @AndyTurner 不错的图片。它不应该为空,它也用 NotNull 注释。然而,由于设置值的框架是非原始的。是的,一个可能会争论的不好的框架,一个可能是正确的。但不是我的选择。有了 Lawrence 的提示,SonarLint 也接受了它。感谢您如此快速地尝试和回复 【参考方案1】:

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

如果我有下一个,Sonar 会抱怨

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

但是如果我添加一个针对空值的快速验证,Sonar 就不再抱怨了

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

现在,正如您提到的,您可以使用 Boolean 类来使用下一个

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

作为

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

听起来 Java 太冗长但在内部,他们检查对象是否为布尔实例,因此他们放弃了为空的可能性,如下所述:Is null check needed before calling instanceof?

你可以从 git repo 中检查它接受了什么,什么不接受:

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

【讨论】:

有趣的是,声纳会接受你声明的空值检查,因为 getter 只是一个可以在每次调用时返回不同值的函数。 我不明白为什么声纳不允许我这样做,这就是您要验证 getter 不返回 null 的原因,因为在每种情况下都有可能你的对象包含真/假/空,只有在运行时你才会知道值 但你没有澄清它。第一次调用 getEnabled 可能会返回不同于第二次调用的其他内容。为了保存在这里,您必须将结果保存到局部变量,然后使用该变量。 我明白它可能会有所不同,但即使您将结果保存到局部变量,您也只会存储对布尔值的引用,而不是实际值,其中可以如果另一个线程使用相同的对象,则更改。原因可能是对象在函数范围内,而不是成员变量,对于声纳,保证没有其他线程会修改该对象。但是,如果可能存在线程不安全,那么正如您提到的将实际值存储在局部变量中是最好的。【参考方案2】:

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

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

【讨论】:

你不需要任何库。只需使用这个Boolean.TRUE.equals(properties.getEnabled()); 它是空安全的【参考方案3】:

试试 .booleanValue() 像这样 if(properties.getEnabled().booleanValue()) 希望对你有所帮助。

【讨论】:

如果properties.getEnabled()返回空值,它会抛出空指针【参考方案4】:

试试这个:

public boolean x () 
    boolean prop=properties.getEnabled() 
    if (prop)  
        return true; 
    else return false; 

【讨论】:

如果properties.getEnabled()返回空值,它会抛出空指针

以上是关于SonarLint 在这里使用原始的布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有定义 Java 的布尔原始大小?

SonarLint:删除不必要的布尔文字

超强布尔表达式

JAVA 流程控制之选择语句

TypeScript简单入门(三):TypeScript原始数据类型表达

分支语句