Подтвердить что ты не робот

Сравнение строки с перечислением

Я анализирую следующий фрагмент кода, используя инструмент статического анализа под названием 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};

тогда предупреждение исчезает. Но я не уверен, действительно ли предупреждение, которое генерирует инструмент, действительно верно и правильно ли я исправляю его? потому что я видел такие сравнения раньше и, кажется, работает правильно.

4b9b3361

Ответ 1

Ваше первое сравнение в основном неверно. Вы сравниваете объекты совершенно разных типов (String и Enum), и они никогда не могут быть равными. даже дает мне предупреждение здесь. Он компилируется только потому, что 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};

Это должно быть хорошо.