2012-07-25 10 views

risposta

12

Nessun insidie ​​ davvero; si comporta come ci si aspetterebbe, se si prevede il comportamento effettivo :) Inoltre, il metodo equals() per gli oggetti Class è solo quello ereditato da Object, che utilizza comunque l'operatore ==.

L'unica parte sorprendente è se lo stesso file di classe viene caricato da due diversi programmi di caricamento classe, si otterranno due oggetti di classe separati che verranno confrontati come false. Questo è di design.

+0

Ma, naturalmente, è completamente corretta per tornare 'false' se ci sono due classloader coinvolti. –

+1

Quale è ciò che "questo è di design" intende implicare. –

1

Non ci sono insidie. Class non sovrascrive il valore predefinito Object.equals quindi è la stessa semantica, tranne che in realtà sarebbe essere un trabocchetto con l'utilizzo di equals poiché l'operando di sinistra è null provocherà un NPE.

+0

E questa trappola è ... – OrangeDog

+0

@OrangeDog ... cosa dice nella risposta. –

+0

@OrangeDog ha menzionato il trabocchetto, anche se non un grosso errore, è ancora un inconveniente quando si confronta con l'uso di '=='. Quindi è una piccola trappola. –

3

Se le classi sono state caricate da diversi ClassLoader s, le classi potrebbero provenire dallo stesso file, ma non rappresentate dallo stesso oggetto. In questa situazione, possono anche avere comportamenti diversi, poiché uno dei caricatori potrebbe aver eseguito modifiche al codice.

0

La classe non esegue l'override equals e estende Object direttamente, equals e == sono gli stessi in questo caso.

Indipendentemente da ciò, la pratica migliore è quella di utilizzare gli eguali quando è possibile.

Se non si conosce il diverso tra == e uguale a leggere su di esso.

-1

Potrebbe essere più saggio fare

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) { 
    return clazz.getName().equals(rootClazz.getName()); 
} 

o qualche versione di getName() come getSimpleName()

+1

'getSimpleName' si interromperà per classi con nomi identici in pacchetti diversi. –