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 在这里使用原始的布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章