Originariamente inviato da andbin
No alt. La implementazione di questi tre metodi non è che è "universale" e chiunque può sapere come farlo nelle tue classi.
Dipende profondamente da come vuoi trattare le proprietà delle tue classi.
String toString()
Questo metodo deve restituire una descrizione "testuale" dell'oggetto, alla fin fine un banale
String che devi comporre tu. Tipicamente questa descrizione la si usa quando si vuole ad esempio stampare o loggare una informazione sull'oggetto.
Non c'è uno standard per la descrizione, basta che sia sufficientemente "esplicativa" per quello che serve e non necessariamente deve essere "localizzata" in qualche lingua o particolarmente forbita o "parlante".
Quali campi inserire nella descrizione lo devi stabilire
tu. Per una classe es. Persona potrebbe essere
il-nome poi
SPAZIO poi
il-cognome oppure altro.
boolean equals(Object)
Questo metodo deve indicare (con true/false) se l'oggetto su cui è invocato è di "significato" equivalente a quello passato come argomento.
Il parametro
deve essere Object. Se l'argomento passato è null
deve essere restituito false (lo dicono le specifiche di equals in Object!).
Tipicamente si verifica se l'oggetto è dello stesso tipo della classe (con l'operatore instanceof) poi si fa il cast e si comparano una o più proprietà dei due oggetti.
Quali proprietà comparare e quindi in che modo due oggetti debbano essere visti come "equivalenti", lo devi stabilire
tu.
int hashCode()
hashCode serve tipicamente nelle mappe basate su hash-table. L'obiettivo del metodo è quello di restituire valori che siano il più possibile "sparpagliati" e con meno probabilità di "collisioni" in base allo stato degli oggetti.
Nota: l'obiettivo NON è quello di restituire valori "univoci" (anche se per certe classi questo è un caso particolare, come per java.lang.Integer).
Se si ridefinisce equals, si dovrebbe anche ridefinire hashCode. Esiste un "contratto" ben preciso tra equals e hashCode (vedere specifiche). Non implementare uno dei due oppure implementarli male significa tipicamente "rompere" questo contratto. E questo può portare a spiacevoli conseguenze quando questi oggetti vengono usati ad esempio nelle mappe (basate su hash-table come HashMap) come "chiavi".
Le implementazioni di equals e hashCode devono rispettare questo "contratto" che ha diverse proprietà ma quella fondamentale è che se due oggetti sono "uguali" (in termini di equals() ), allora
devono fornire lo stesso hashCode.
Generalmente se si usa un IDE (Eclipse, NetBeans, ecc...) c'è un wizard apposito che genera il codice per hashCode che è molto "buono" (la bontà, in questo senso, è appunto la capacità di sparpagliare i valori e con meno probabilità di collisioni).