亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

必須使用“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 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號