Perché è difficile (impossibile?) Farlo in modo corretto, in particolare lo symmetric property.
Supponiamo di avere la classe Vehicle
e la classe Car extends Vehicle
. Vehicle.equals()
produce true
se l'argomento è anche un Vehicle
e ha lo stesso peso. Se si desidera implementare Car.equals()
dovrebbe cedere true
solo se l'argomento è anche una macchina, e ad eccezione di peso, si deve anche confrontare fare, motore, ecc
Ora immaginate il seguente codice:
Vehicle tank = new Vehicle();
Vehicle bus = new Car();
tank.equals(bus); //can be true
bus.equals(tank); //false
Il primo confronto potrebbe dare true
se per coincidenza serbatoio e bus hanno lo stesso peso. Ma dal momento che il serbatoio non è un'auto, il confronto con un'auto produrrà sempre false
.
Si hanno pochi work-around:
rigorosa: due oggetti sono uguali se e solo se hanno esattamente lo stesso tipo (e tutte le proprietà sono uguali). Questo è male, ad es. quando sottoclassi a malapena per aggiungere qualche comportamento o decorare la classe originale. Alcuni framework sottoclassi anche le classi senza che tu te ne accorga (Hibernate, Spring AOP con proxy CGLIB ...)
allentato: due oggetti sono uguali se i loro tipi sono "compatibili" e hanno lo stesso contenuto (semanticamente). Per esempio. due set sono uguali se contengono gli stessi elementi, non importa che uno sia HashSet
e l'altro sia TreeSet
(grazie @veer per averlo indicato).
Questo può essere fuorviante. Prendi due LinkedHashSet
s (dove l'ordine di inserimento è valido come parte del contratto). Tuttavia, poiché equals()
richiede solo crudo Set
contratto di conto, i rendimenti di confronto true
anche per gli oggetti ovviamente diverse:
Set<Integer> s1 = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3));
Set<Integer> s2 = new LinkedHashSet<Integer>(Arrays.asList(3, 2, 1));
System.out.println(s1.equals(s2));
Vedi anche
fonte
2012-09-02 20:14:32
'Comparable' specifica' compareTo', non 'equals', a proposito. – oldrinb
Oh. grazie :) Ho modificato: D – hqt
Qual è il nome del libro? –