V6101. compareTo()-like methods can return not only the values -1, 0 and 1, but any values.
Анализатор обнаружил в коде сравнение результата метода 'Comparable.compareTo' или ему подобному с конкретным ненулевым значением (в частности, с 1 и -1). В свою очередь, в спецификации языка Java контракт этого метода подразумевает, что может вернуться любое положительное число или любое отрицательное.
Работоспособность конструкции 'compareTo == 1' зависит от реализации этого метода. Поэтому сравнивать результат с конкретным числом считается плохой практикой, которая в некоторых случаях может привести к трудноуловимым ошибкам. В таких случаях корректно писать 'compareTo > 0'.
В качестве примера можно привести следующий некорректный код:
void smt(SomeType st1, SomeType st2, ....)
{
....
if (st1.compareTo(st2) == 1)
{
// some logic
}
....
}
Разработчик долгое время мог работать над другим проектом, где, в силу специфики реализации интерфейса 'Comparable', сравнивать результат 'compareTo' с 1 было корректно. Перейдя на следующий проект, он продолжил так сравнивать, но специфика реализации метода уже отличалась - в зависимости от тех или иных условий возвращались разные положительные числа.
Исправленный вариант кода:
void smt(SomeType st1, SomeType st2, ....)
{
....
if (st1.compareTo(st2) > 0)
{
// some logic
}
....
}
Анализатор также считает код ошибочным, если в нём сравнивается результат работы двух 'compareTo' методов. Подобный код встречается крайне редко, однако на него в любом случае стоит обратить внимание.
Данная диагностика классифицируется как:
|