我们正在使用 Sonar 检查代码的质量,Sonar 找到了比较 float 或 double 与常量值是否相等的代码,如下所示:
if (x == 0.0) { … }
变量与 (0.0
) 比较的值是常量,如果变量可以等于该值,则该值也不会被计算,而只能通过常量设置。这通常用于检查变量是否尚未设置或仍处于初始化状态,例如。 G。 -1.0
在值只能为正的情况下可能用于“尚未设置”。
因此,由于这些值从未计算,而只是从常量设置,因此 Sonar 投诉对我们没有用。只有对于计算值(或不能精确表示为 float 或 double 值的断裂值),对相等性测试的提示才有意义。
我现在的问题是:更改代码以使 Sonar 不再提示此问题的最佳做法是什么?
我看到几个选项:
- 将“test-for-unset”提取到一个特殊的测试函数中;但这只会减少出现次数(减少到 1 次),而不是一般问题。
- 用特殊的装饰器标记 Sonar 忽略它的代码。但我们希望避免使用此类装饰器。
- 隐藏某事背后的比较,如
(0.0 <= x && x <= 0.0)
或!(x != 0.0)
(目前看来 Sonar 没问题)。 - 调用
Double.doubleToRawLongBits()
像这样比较值的位:(Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(0.0))
. - 其他想法?
这些解决方案中没有一个是我真正喜欢的,我认为也许有我想不到的更好的解决方案。
最佳答案
我会选择你的第二个选项:
Mark the code for Sonar to ignore it with a special decorator.
不要成为静态代码分析工具的奴隶。他们并不完美,让他们闭嘴也没什么错。在使用像 @SuppressLint
这样的注释时,我个人的做法是包含一条注释来解释我为什么要使用它。
也就是说,我会创建一个常量,这样代码就更加不言自明了:
private static final double UNINITIALIZED = 0.0;
if (x == UNINITIALIZED) { … }
关于java - 检查 double 是否相等和 Sonar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942032/