2015-06-18 3 views
6

Ниже сравнивается два значения перечислений с использованием ==:Почему сравнение перечислений с использованием == вызывает предупреждение PMD?

MyEnum enum1 = blah();  // could return null 
MyEnum enum2 = blahblah() // could return null 
if (enum1 == enum2) { 
    // ... 
} 

Но PMD дает CompareObjectsWithEquals предупреждения в строке 3:

Использование равно() для сравнения ссылок на объекты

Не уверен, Я понимаю source code for this check, но думал, что было бы хорошо сравнить два перечисления, используя ==, поэтому мне интересно, может ли мой код быть улучшен или che ck неверно.

+2

это нормально. Может быть релевантно: http://sourceforge.net/p/pmd/bugs/1028/ – MadConan

ответ

18

Это действительно принимается как ошибка:

Однако, это, кажется, сложно охватить все возможные случаи (цитата из новой ошибки):

Это немного сложно, так как для определения того, является ли тип a Enum, нам нужно разрешение по типу.

Мне удалось настроить правило, чтобы проверить, является ли тип переменных Enum. Это работает только, если типы Enum находятся на «auxclasspath» pmd, так что разрешение типа может найти его.

Ваш пример в изоляции по-прежнему вызывает это ложное срабатывание, так как PMD не знает, что такое ProcessStatus. Я проверил его с java.math.RoundingMode, который всегда находится в пути к классам и будет разрешен.

(«Ваш пример» относится к автору билета, а не ОП на переполнении стека)

Вашего случая могущества работы с PMD 5, источник, который вы связаны принадлежит PMD 4.

Обновление: current source содержит дополнительную проверку для перечислений:

// skip, if it is an enum 
if (type0.getType() != null && type0.getType().equals(type1.getType()) && type0.getType().isEnum()) { 
     return data; 
} 
4

Это нормально использовать .equals(), потому что under the hoods, что случается, что экземпляры сравниваются с ==.

public final boolean equals(Object other) { 
    return this==other; 
} 

Обратите внимание, что эта реализация .equals() является final, что означает, что вы не можете изменить его в перечислении.

+0

Спасибо - но одно из перечислений может быть нулевым, поэтому не нужно рисковать NullPointerException. –

+0

Затем вам нужно будет добавить чек. Или используйте тип «Необязательный » Java8. :) –

+6

Или придерживайтесь 'enum1 == enum2' и игнорируйте это предупреждение PMD. – stuXnet