Сравнение строки с перечислением
Я анализирую следующий фрагмент кода, используя инструмент статического анализа под названием 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};
тогда предупреждение исчезает. Но я не уверен, действительно ли предупреждение, которое генерирует инструмент, действительно верно и правильно ли я исправляю его? потому что я видел такие сравнения раньше и, кажется, работает правильно.
Ответы
Ответ 1
Ваше первое сравнение в основном неверно. Вы сравниваете объекты совершенно разных типов (String
и Enum
), и они никогда не могут быть равными. intellij даже дает мне предупреждение здесь. Он компилируется только потому, что equals()
принимает Object
, а не String
.
Второе сравнение правильно.
Хотя JavaDoc немного жестко по методу name()
, я бы на самом деле советовал использовать его в случае, если enum имеет toString()
overriden:
if(str.equals(FooEnum.SOMEVALUE.name()))
Ответ 2
Я думаю, что заменить константу для toString()
может быть правильным, я бы изменил ее для .name()
, хотя из-за того, что toString следует переоценить.
Ответ 3
вы можете попробовать
enum.SOMEVALUE.name()
поскольку он
Возвращает имя этой константы перечисления, точно так же, как указано в объявлении перечисления.
Ответ 4
Я бы предложил использовать:
if (SomeEnum.SOMEVALUE == SomeEnum.valueOf(str)) {
}
Ответ 5
Насколько я знаю, вы на правильном пути.
if(str.equals(enum.SOMEVALUE.toString())) {// do something};
Это должно быть хорошо.