Я анализирую следующий фрагмент кода с помощью инструмента статического анализа под названием FindBugs.сравнение строки с перечислением
if(str.equals(enum.SOMEVALUE)) {// do something};
где str - это строка, а перечисление - перечисление. Инструмент генерирует следующее предупреждение для этого кода и указывает
Этот метод вызывает equals (Object) на двух ссылках разных типов классов без общих подклассов. Согласно договору equals(), объекты разных классов всегда должны сравниваться как неравные; поэтому, согласно контракту, определенному java.lang.Object.equals (Object), результат этого сравнения всегда будет ложным во время выполнения.
если заменить выше строки кода с этим:
if(str.equals(enum.SOMEVALUE.toString())) {// do something};
то предупреждение disappears.But Я не уверен, если предупреждение о том, что инструмент генерирует действительно так и ли я ее исправление правильный путь ? потому что я видел такие сравнения раньше и, похоже, работает правильно.
Большое спасибо за советы по использованию имени(), что делает мой текущий подход к полю id в подобных ситуациях устаревшим. – Bananeweizen
Обратите внимание, что объекты разных типов, безусловно, могут быть равны в соответствии с equals(). И FindBugs, и IntelliJ ошибочны.В стандартном java-интерфейсе есть пример, где это выполняется: реализации реализации интерфейса List равны, сравнивая элементы, даже для разных подклассов List. – herman
@herman: вы правы, но 'equals()' должно быть * симметрией *, что легко сделать с помощью реализаций «List» (все они основаны на 'AbstractList'), но не в случае OP. –