为了账号安全,请及时绑定邮箱和手机立即绑定

必须使用“putIfAbsent”的返回值——真的吗?

必须使用“putIfAbsent”的返回值——真的吗?

慕尼黑8549860 2022-07-14 10:13:32
我有一个像这样的 ConcurrentMaps 的 ConcurrentMap ...ConcurrentMap<String, ConcurrentMap<K, V>> mapsMap = new ConcurrentHashMap<>();现在以某种方法,我想通过确保存在这样的某个键的映射来防止 NPE... mapsMap.putIfAbsent(someKey, new ConcurrentHashMap<K, V>());......所以我可以安全地调用...... mapsMap.get(someKey).put(...);...不用担心这里的空值。现在,Sonarqube 告诉我,这违反了RSPEC-2201规则......不应忽略来自没有副作用的函数的返回值 [..] 以及在 ConcurrentMap.putIfAbsent 调用上忽略的返回值。这只是 SonarQube 没有检测到该方法的副作用对我来说已经足够了(并且返回值不会添加任何信息)还是我错过了关于 putIfAbsent 合约的重要一点?
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

如果指定的键尚未与值关联(或映射到 null),则将其与给定值关联并返回 null,否则返回当前值。

如果不需要,您可以放心地忽略返回的值。
Sonarqube对于某些规则非常具有侵入性,因此只需禁用它并继续您的业务。

恕我直言,该特定规则主要是针对由多个开发人员编写代码的项目中的常见模式设置的。


查看完整回答
反对 回复 2022-07-14
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

除了@LppEdd 的正确分析器之外,这个问题也在sonarqube 论坛上得到了回答:

基本上,这条规则取自 FindBugs 的规则RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED

putIfAbsent 方法通常用于确保单个值与给定键相关联(如果不存在则放置成功的第一个值)。如果忽略返回值并保留对传入值的引用,则可能会保留与映射中的键不相关的值。如果您使用哪一个很重要,而您使用了未存储在地图中的那个,那么您的程序将运行不正确。

在这种情况下,我不保留对存储值的引用,这确实是误报。

将来,此特定规则可能会在 SonarQube 中作为单独的规则实施,而不再作为当前规则 (RSPEC-2201) 的一部分。


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信