Мы проверяем качество нашего кода с помощью Sonar, и Sonar нашел код, который сравнивает float или double для равенства с постоянным значением, подобным этому:
if (x == 0.0) { … }
Значение, которое переменная сравнивается с (0.0
), является постоянной, и в случае, если переменная может быть равна этому значению, значение также не вычисляется, а устанавливается только через константу. Обычно это используется для проверки того, была ли переменная еще не установлена или все еще находится в состоянии инициализации, e. г. -1.0
может использоваться для "еще не установленного" в случаях, когда значение может быть только положительным.
Итак, поскольку эти значения никогда не вычисляются, а только задаются из констант, жалоба на Sonar не полезна для нас. Только для вычисленных значений (или раздробленных, которые не являются точно представленными как поплавки или двойники) жалоба на проверку равенства имеет смысл.
Теперь у меня есть вопрос: что лучше всего изменить код, чтобы Sonar больше не жаловался на это?
Я вижу несколько вариантов:
- Извлеките "test-for-unset" в специальную тестовую функцию; но это уменьшит количество случаев (до 1), а не проблему вообще.
- Отметьте код для Sonar, чтобы игнорировать его с помощью специального декоратора. Но мы хотели бы избежать использования таких декораторов.
- Скрыть сравнение позади sth, например
(0.0 <= x && x <= 0.0)
или!(x != 0.0)
(что в настоящее время кажется подходящим для Sonar). - Вызов
Double.doubleToRawLongBits()
для сравнения битов таких значений:(Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(0.0))
. - Другие идеи?
Ни один из этих решений мне не очень нравится, и я подумал, может быть, есть лучший, о котором я не могу думать.