2012-12-10 19 views
5

In Effective Java punto 9 (ignorare sempre hashCode quando si modifica equals) dove si diceJava librerie della piattaforma HashCode

Molte classi nelle librerie della piattaforma Java, quali String, Integer, e la data, includono in le loro specifiche il valore esatto restituito dal loro metodo hashCode come una funzione del valore di istanza. Generalmente non è una buona idea, in quanto limita fortemente le tue capacità per migliorare la funzione di hash nelle versioni future.

Che cosa significa?

+0

Quale parte non capisci? – SLaks

+1

Significa che i sorgenti Java non sono sempre un modello di buon stile di programmazione. –

risposta

4

Significa che non è possibile riscrivere la funzione di hash nelle versioni successive del codice per avere proprietà di hashing migliori. Ad esempio, la funzione String.hashCode() è veloce ... ma non molto buona. Ma non può più essere modificato, perché il codice hash è stato specificato e le persone sono dipese da tale implementazione nel proprio codice.

+0

Cosa intendi con "perché il codice hash è stato specificato e le persone dipendono da tale implementazione nel loro codice"? È come qualcuno lo fa: int hash = string.hashCode() E poi più tardi fanno qualcosa di stupido come asserire (hash == 12345) ? – Hiro2k

+3

@ Hiro2k - I documenti API specificano che 'String.hashCode()' è calcolato da una formula specifica. Il codice cliente è libero di calcolare in modo indipendente il codice hash usando quella formula esatta e si assume che sarà lo stesso di quello restituito da 'String.hashCode()'. Questo potrebbe sembrare perverso per puro codice Java, ma ha un senso con JNI. Ci sono probabilmente altri casi in cui avrebbe senso sfruttare la conoscenza extra che specifica l'API. –

+0

Questo ha molto più senso. Grazie Ted Hopp – Hiro2k