2012-09-16 14 views
8

Se è necessario utilizzare un Class<T> come parte di una chiave di un Map qual è il modo corretto per definire lo e equals?
Un Class<T> eredita quelli di Object che controllano per l'uguaglianza di riferimento e restituire l'indirizzo di memoria come il codice hash, ma nella mia mente non è chiaro che cosa è la definizione di significativo equals e hashCode definizione di un Class<T>.
Devo utilizzare theClass.getClass().hashCode(); ad esempio (dove abbiamo Class<T> theClass;) per utilizzare i metodi dell'istanza effettiva?
Ma questa non sembra essere la cosa giusta da fare.
Ad esempio nel javadoc per Class<T>:Come definire in modo significativo hashCode ed equals per un java.lang.Class <T>?

Ogni matrice appartiene ad una classe che si riflette come oggetto Class che è condiviso da tutti gli array con lo stesso tipo di elemento e numero di dimensioni

Quindi sembra che in alcuni casi lo stesso Class<T> sia condiviso tra gli oggetti? Quindi quale sarebbe il modo di seguire? È possibile utilizzare theClass.hashCode() e theClass.equals() per utilizzare l'uguaglianza di riferimento? Non sono affatto sicuro qui.

+0

Non c'è nulla da definire, dal momento che hashcode e gli equals sono già stati implementati, e ho difficoltà a immaginare come e ancora più difficile immaginare il motivo per cui dovresti cambiare quell'implementazione. –

+0

@JensSchauder: Usando Eclipse per generare automaticamente 'hashCode' e' equals' ha dato un avvertimento lamentando che 'hashCode' e' equals' non sono definiti per 'Class'. Questo mi ha fatto preoccupare se si tratta di un avviso valido e io dovrebbe fare qualcosa al riguardo. – Cratylus

+0

Non so cosa stai cercando di fare, ma 'Class' è una classe che fa parte di java stesso. Non puoi implementare nulla per questo. Qual è il nome completo del file sorgente in cui si tenta di aggiungere hashCode ed equals? –

risposta

8

L'attuazione di hashCode e equalsjava.lang.Class ereditato da java.lang.Object significativa e generalmente appropriato, come tutte le istanze di una classe sono garantiti per restituire lo stesso oggetto Class da getClass(), cioè

new Integer(2).getClass() == new Integer(3).getClass(); 

Questo è alquanto sepolto nei documenti; il javadoc of getClass() scrive:

Returns:

l'oggetto di classe che rappresenta la classe di esecuzione di questo oggetto.

Vedere anche:

letterali, sezione 15.8.2 di The Java ™ Language Specification.

That section scrive:

Una classe Esamina letterali all'oggetto Class per il tipo di chiamata (o per nulla) definita dal caricatore di classe che definisce (§12.2) della classe dell'istanza corrente .

e section 12.2 scrive:

caricatori di classe ben educati mantengono queste proprietà:

  • dato lo stesso nome, una buona classe loader dovrebbe sempre restituire lo stesso oggetto di classe.
  • ...

Un class loader malintenzionato potrebbe violare queste proprietà. Tuttavia, non è in grado di compromettere la sicurezza del sistema di tipi, perché la macchina virtuale Java lo protegge.

E sì, se la stessa definizione di classe viene caricata da caricatori di classi differenti, gli oggetti di classe non saranno uguali. Poiché il runtime le traccia come classi indipendenti (che semplicemente condividono lo stesso nome, ma non è necessario che siano altrimenti simili, per non parlare della compatibilità binaria), ciò è solitamente desiderato.

+0

Nota a margine su questo: applicazioni come Tomcat utilizzano un classloader gerarchico e questo può morderti. Tomcat dà a tutte le sue applicazioni il proprio stack di classloader. –

0

Il metodo String getName() restituisce un unico Rappresentazione in stringa della Classe. Puoi utilizzare questa stringa per uguaglia/hashCode come stringa ordinaria se il tuo programma non usa più di un classloader.

+0

Ma non faccio 'Map , T>'. La mia domanda è quando 'Classe ' è ** parte ** di una chiave.Non la chiave stessa – Cratylus

+0

@Cratylus La risposta è la stessa; si usa getName() che restituisce una rappresentazione String univoca dell'oggetto Class; si utilizza questa stringa in hashing/uguale come se fosse un campo di istanza String. – m3th0dman

Problemi correlati