Estoy analizando la siguiente pieza de código usando una herramienta de análisis estático llamada FindBugs.comparando cadena con la enumeración
if(str.equals(enum.SOMEVALUE)) {// do something};
donde str es una Cadena y enumeración es una enumeración. La herramienta genera la siguiente advertencia para este código y estados
Este método llama a igual (Objeto) en dos referencias de tipos de clases diferentes sin subclases comunes. De acuerdo con el contrato de iguales(), los objetos de diferentes clases siempre deben compararse como desiguales; por lo tanto, de acuerdo con el contrato definido por java.lang.Object.equals (Object), el resultado de esta comparación siempre será falso en el tiempo de ejecución.
si se sustituye la línea de código anterior con esto:
if(str.equals(enum.SOMEVALUE.toString())) {// do something};
entonces la advertencia disappears.But no estoy seguro de si la advertencia de que la herramienta genera es realmente cierto y si estoy arreglando la manera correcta ? porque he visto tales comparaciones antes y parece estar funcionando correctamente.
Muchas gracias por el consejo de usar name(), haciendo obsoleto mi enfoque actual de un campo de id. En situaciones similares. – Bananeweizen
Tenga en cuenta que los objetos de diferentes tipos definitivamente pueden ser iguales de igual a igual(). Both FindBugs e IntelliJ son incorrectos.Incluso hay un ejemplo en la API estándar de Java donde se hace esto: las implementaciones de la implementación de la interfaz de la Lista son iguales al comparar los elementos, incluso para diferentes subclases de la Lista. – herman
@herman: tiene razón, pero 'equals()' tiene que ser * symmetrics *, lo cual se hace fácilmente con las implementaciones 'List' (todas están basadas en' AbstractList') pero no en el caso OP. –