Originariamente inviato da np2k
Leggendo inutili dispense di ingegneria del software, mi sono imbattuto in una questione poco chiara riguardo la ridefinizione di equals.
Hai appena spiegato che quelle dispense sono inutili
... ascolta questo allora:
La questione del equals() non centra niente con il fatto che un oggetto sia immutabile (vedi ad es. String) o mutabile. equals() serve per stabilire se 2 oggetti sono, come si dice in inglese, "meaningfully equivalent", cioè se i 2 oggetti sono di significato equivalente. In pratico se hanno lo stesso contenuto.
Prendiamo questo codice (che ho scritto io per fare un esempio):
codice:
public class Prova
{
public static void main (String[] args)
{
Numero n1 = new Numero (12);
Numero n2 = new Numero (12);
System.out.println ("n1.equals (n1) = " + n1.equals (n1));
System.out.println ("n1.equals (n2) = " + n1.equals (n2));
}
}
class Numero
{
private int num;
public Numero (int n)
{
num = n;
}
}
Come vedi non ho fatto l'override di equals() nella classe Numero. Quindi viene usato il equals() della classe Object, che ovviamente, non sapendo come confrontare gli oggetti, è solo in grado di confrontare i 2 reference.
Se provi questo codice, stampa:
n1.equals (n1) = true
n1.equals (n2) = false
Questo perché come ho appena detto, equals() di Object non sa fare altro che confrontare i reference quindi n1 è un reference diverso da n2 e quindi false. Anche se in realtà hanno lo stesso contenuto.
Ora metti questo metodo nella classe Numero:
codice:
public boolean equals (Object o)
{
if (o instanceof Numero)
return num == ((Numero) o).num;
return false;
}
Riprova e vedrai che stampa:
n1.equals (n1) = true
n1.equals (n2) = true
Quindi ridefinendo equals() posso stabilire se 2 oggetti hanno lo stesso "significato".
Nota che la classe Numero potrei farla mutabile o immutabile, la questione del equals() non cambia. Potrei aggiungere un metodo void setNumero (int n) per fare in modo da poter modificare l'oggetto Numero anche dopo la sua creazione, rendendolo così mutabile. Ma equals non cambia!