Porque es difícil (¿imposible?) Hacerlo bien, especialmente el symmetric property.
Digamos que tiene la clase Vehicle
y la clase Car extends Vehicle
. Vehicle.equals()
produce true
si el argumento es también Vehicle
y tiene el mismo peso. Si se desea implementar Car.equals()
debe dió true
sólo si el argumento es también un coche, y con excepción de peso, sino que también debe comparar realizar, motor, etc.
Ahora imagine el siguiente código:
Vehicle tank = new Vehicle();
Vehicle bus = new Car();
tank.equals(bus); //can be true
bus.equals(tank); //false
La primera comparación podría arrojar true
si coinciden el tanque y el autobús tienen el mismo peso. Pero como el tanque no es un automóvil, compararlo con un automóvil siempre dará como resultado false
.
usted tiene pocas soluciones temporales:
estricto: dos objetos son iguales si y sólo si tienen exactamente el mismo tipo (y todas las propiedades son iguales). Esto es malo, p. cuando subclases apenas para agregar algún comportamiento o decorar la clase original. Algunos frameworks también están subclasificando tus clases sin que notes (Hibernate, Spring AOP con proxies CGLIB ...)
loose: dos objetos son iguales si sus tipos son "compatibles" y tienen los mismos contenidos (semánticamente). P.ej. dos conjuntos son iguales si contienen los mismos elementos, no importa que uno sea HashSet
y el otro sea TreeSet
(gracias @veer para señalar eso).
Esto puede ser engañoso. Tome dos LinkedHashSet
s (donde el orden de inserción es importante como parte del contrato). Sin embargo, desde equals()
sólo toma cruda Set
contrato en cuenta, los rendimientos de comparación true
incluso para obviamente diferentes objetos:
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));
Ver también
'Comparable' especifica' compareTo', no 'equals', por cierto. – oldrinb
Oh. gracias :) He editado: D – hqt
¿Cuál es el nombre del libro? –