目前正在测试一些新的声纳规则。随着新的声纳规则,出现了新的代码气味。 " Lambda应该替换为方法引用"。 我认为规则很酷,但有一个案例我有一些问题 我举一个例子,也许有人可以解释这个案子:
目前看来如下:
rxTransaction( () -> new SubscriptionJavaLite( subscription ).toSubscription());
我的第一个天真的想法(以及Intellij的建议)是使用以下方法参考:
rxTransaction( new SubscriptionJavaLite( subscription )::toSubscription);
所以声纳很满意,一切看起来都一样。但它不再等效,因为new SubscriptionJavaLite
在不同时间执行:
案例1运行rxTransaction - >新的SubscriptionJavaLite
案例2执行新的SubscriptionJavaLite - > rxTransaction。差不多早了。
是否有可能以不同的方式解决案件?这个发现只是声纳规则的一个错误吗? 现在我不想在所有地方都写出SupressWarning。
感谢您的帮助。
答案 0 :(得分:1)
这确实是通过实施规则squid:S1612无法正确处理的情况。
我建议你将此标记为误报(FP)而不是修复它。正如你正确提到的那样,两种情况都不完全相同,因此规则不应该引起问题。有关这些案例不相同的原因的详细信息,请参阅JLS §15.13 - Method Reference Expressions。
以下故障单将修复实施:SONARJAVA-2763