我有这样的ConcurrentMaps的ConcurrentMap ...
ConcurrentMap<String, ConcurrentMap<K, V>> mapsMap = new ConcurrentHashMap<>();
现在,通过某种方法,我想通过确保像这样的某个键存在一个映射来防止NPE ...
mapsMap.putIfAbsent(someKey, new ConcurrentHashMap<K, V>());
...所以我可以放心地打电话给...
mapsMap.get(someKey).put(...);
...这里不必担心null值。
现在,Sonarqube告诉我,这违反了规则RSPEC-2201 ...
不应忽略没有副作用的函数的返回值 [..]以及ConcurrentMap.putIfAbsent调用都忽略了返回值。
这只是SonarQube是否没有检测到该方法的副作用足以满足我的要求(并且返回值不会添加任何信息),还是我缺少关于putIfAbsent合同的重要意义?
答案 0 :(得分:4)
如果指定的键尚未与值关联(或为 映射为null)将其与给定值相关联并返回null, 否则返回当前值。
如果不需要,可以放心地忽略返回的值。
Sonarqube
具有某些规则的侵入性,因此只需禁用它并继续开展业务即可。
Imho,该特定规则主要是针对由多个开发人员编写代码的项目中的通用模式设置的。
答案 1 :(得分:2)
除了@LppEdd提供的正确答案外,这个问题也在answered的声纳古堡论坛上已经结束:
该规则基本上取自FindBugs的规则RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED
putIfAbsent方法通常用于确保单个值 与给定键相关联(如果 缺席成功)。如果忽略返回值并保留一个 参考传入的值,您可能会保留 值,该值不是与映射中的键关联的值。 如果重要的是您使用的是哪一种,而您使用的是未存储的那一种 在地图上,您的程序将无法正常运行。
在这种情况下,我不保留对存储值的引用,这的确是误报。
此特定规则将来可能会在SonarQube中作为单独的规则实施,而不再是当前规则(RSPEC-2201)的一部分。