【发布时间】:2019-02-27 20:17:50
【问题描述】:
我有一个像这样的 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 合约的重要一点?
【问题讨论】:
-
如果您的示例中最后两个 sn-ps 相互跟随,请执行此操作
mapsMap.putIfAbsent(someKey, new ConcurrentHashMap<K, V>()).put(aValue) -
我确实想知道他们在想什么。同样奇怪的是,他们只对 ConcurrentHashMap.putIfAbsent 这样做——而不是 Map.putIfAbsent,它具有相同的合同。
-
@yshavit 同意。它可能与并发有关。但是哪一个? :)
-
@davidxxx 这对我来说没有任何意义,所以很难说。 :-) 这也很奇怪,因为他们的文档说 RSPEC-2201 是关于“没有副作用的函数”,并且 put 肯定有副作用。我可能会忽略一些东西,但我实际上怀疑这只是这方面的一个违规规则。
-
@Florian Schaetz 有道理,你的意图是好的:如果我们得到他们的回答,它很可能会帮助其他人。