¿Cuáles son los inconvenientes de comparar instancias de clase utilizando el operador de igualdad?Comparando dos clases usando el operador de igualdad
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
¿Cuáles son los inconvenientes de comparar instancias de clase utilizando el operador de igualdad?Comparando dos clases usando el operador de igualdad
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
No hay trampas realmente; se comporta como cabría esperar, si espera el comportamiento real :) Además, el método equals()
para los objetos Class
es simplemente el heredado de Object
, que usa el operador ==
de todos modos.
La única parte sorprendente es que si dos cargadores de clases diferentes cargan el mismo archivo de clase, obtendrá dos objetos de clase separados que se compararán como false
. Esto es por diseño.
No hay riesgos. Class
no anula el predeterminado Object.equals
por lo que es la misma semántica, excepto que en realidad sería ser una trampa con el uso de equals
ya que el operando de la izquierda es null
provocará un NPE.
Y esta trampa es ... – OrangeDog
@OrangeDog ... lo que dice en la respuesta. –
@OrangeDog mencionó la trampa, aunque no es un gran escollo, sigue siendo un inconveniente cuando se compara con el uso del '=='. Entonces, es un pequeño escollo. –
Si las clases fueron cargadas por diferentes ClassLoader
s, entonces las clases pueden ser del mismo archivo, pero no representadas por el mismo objeto. En esta situación, también pueden tener un comportamiento diferente, ya que uno de los cargadores puede haber realizado modificaciones de bytecode.
La clase no anula iguales y extiende Object directamente, equals y == son lo mismo en este caso.
De todos modos, la mejor práctica es usar iguales cuando se pueda.
Si no conoce la diferencia entre == e igual, vaya a leer sobre él.
Puede ser más prudente hacer
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz.getName().equals(rootClazz.getName());
}
o alguna versión de getName()
como getSimpleName()
'getSimpleName' se dividirá para clases idénticas en diferentes paquetes. –
Pero, por supuesto, es totalmente adecuado para volver 'false' si hay dos cargadores de clases involucradas. –
Que es lo que significa "esto es por diseño". –