Правило сонара: лямбды следует заменять ссылками на методы - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я тестирую некоторые новые правила сонара. С новыми правилами сонара появился новый запах кода. Msgstr "Лямбда должна быть заменена ссылками на методы". Я думаю, что правило довольно круто, но с 1 случаем у меня есть некоторые проблемы Я приведу пример, и, возможно, кто-то может объяснить этот случай:

В настоящее время вызов выглядит так:

rxTransaction( () -> new SubscriptionJavaLite( subscription ).toSubscription());

Моей первой наивной мыслью (а также предложением Intellij) было использование следующих методов:

rxTransaction( new SubscriptionJavaLite( subscription )::toSubscription);

Итак, Сонар был доволен, и все выглядит одинаково. Но это больше не эквивалентно, потому что new SubscriptionJavaLite выполняется в разное время:

Случай 1 запускает rxTransaction -> new SubscriptionJavaLite

Случай 2 выполняет новую SubscriptionJavaLite -> rxTransaction. Почти раньше.

Можно ли решить дело иначе? Является ли этот вывод ошибкой из правила сонара? Теперь я не хочу писать SupressWarning во всех случаях.

Спасибо за помощь.

1 Ответ

0 голосов
/ 16 мая 2018

Это действительно тот случай, который неправильно обрабатывается реализацией правила squid: S1612 .

Я бы посоветовал вам пометить это как ложное срабатывание (FP) и не исправитьЭто.Как вы правильно упомянули, оба случая совсем не эквивалентны, и поэтому правило не должно поднимать здесь проблему.Для получения более подробной информации о том, почему эти случаи не эквивалентны, см. JLS §15.13 - Выражения ссылки на метод .

Следующая заявка исправит реализацию: SONARJAVA-2763

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