Возвращаемое значение "putIfAbsent" должно быть использовано - правда? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть ConcurrentMap из ConcurrentMaps, подобный этому ...

ConcurrentMap<String, ConcurrentMap<K, V>> mapsMap = new ConcurrentHashMap<>();

Теперь, в каком-то методе, я хотел бы предотвратить использование NPE, убедившись, что существует карта для определенного ключа, подобного этому ...

 mapsMap.putIfAbsent(someKey, new ConcurrentHashMap<K, V>());

... так что я могу смело вызывать такие вещи, как ...

 mapsMap.get(someKey).put(...);

... не беспокоясь о нулевых значениях здесь.

Теперь Сонаркуб говорит мне, что это нарушает правило RSPEC-2201 ...

Возвращаемые значения из функций без побочных эффектов не следует игнорировать[..] а также при вызовах ConcurrentMap.putIfAbsent игнорируемое возвращаемое значение.

Это просто SonarQube не обнаруживает, что побочный эффект метода мне достаточно здесь (и возвращаемое значение не добавитЛюбая информация) или я упускаю важный момент о контракте putIfAbsent?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В дополнение к правильному ответу @LppEdd, на этот вопрос также ответили на форумах sonarqube:

В основном это правило было взято из правила FindBugs RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED

Метод putIfAbsent обычно используется для обеспечения того, чтобы с данным ключом было связано одно значение (первое значение, для которого put, если отсутствует, успешно).Если вы игнорируете возвращаемое значение и сохраняете ссылку на переданное значение, вы рискуете сохранить значение, не связанное с ключом на карте.Если имеет значение, какой из них вы используете, а вы используете тот, который не хранится на карте, ваша программа будет работать неправильно.

Как и в этом случае, я не сохраняю ссылку на значениесохранено, это действительно будет ложным срабатыванием.

Вполне вероятно, что это конкретное правило будет реализовано как отдельное правило в SonarQube в будущем, а не как часть текущего правила (RSPEC-2201).

0 голосов
/ 27 февраля 2019

Если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), связывает его с данным значением и возвращает значение NULL, иначе возвращается текущее значение.

Выможет безопасно игнорировать возвращаемое значение, если оно вам не нужно.
Sonarqube довольно агрессивно с некоторыми правилами, поэтому просто отключите его и продолжайте свой бизнес.

Imho, это конкретное правилов основном устанавливается для общих шаблонов в проекте, где код написан несколькими разработчиками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...