2012-07-25 28 views

Respuesta

12

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.

+0

Pero, por supuesto, es totalmente adecuado para volver 'false' si hay dos cargadores de clases involucradas. –

+1

Que es lo que significa "esto es por diseño". –

1

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.

+0

Y esta trampa es ... – OrangeDog

+0

@OrangeDog ... lo que dice en la respuesta. –

+0

@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. –

3

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.

0

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.

-1

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()

+1

'getSimpleName' se dividirá para clases idénticas en diferentes paquetes. –