Ponieważ jest to trudne (niemożliwe?), Aby to naprawić, zwłaszcza symmetric property.
Powiedz, że masz klasę Vehicle
i klasę Car extends Vehicle
. Vehicle.equals()
plony true
, jeśli argument jest również Vehicle
i ma taką samą wagę. Jeśli chcesz wdrożyć Car.equals()
powinno uzyskując true
tylko jeśli argument jest także samochód, a oprócz wagi, należy również dokonać porównania, silnik, itp
teraz wyobrazić następujący kod:
Vehicle tank = new Vehicle();
Vehicle bus = new Car();
tank.equals(bus); //can be true
bus.equals(tank); //false
Pierwsze porównanie może dać true
, jeśli przez koincydencję zbiornik i autobus mają tę samą wagę. Ale ponieważ czołg nie jest samochodem, porównanie go z samochodem zawsze przyniesie false
.
Masz kilka obejścia:
ścisłe: dwa obiekty są równe wtedy i tylko wtedy mają dokładnie ten sam typ (i wszystkie właściwości są równe). To jest złe, np. gdy podklasujesz ledwo, aby dodać jakieś zachowanie lub udekorować oryginalną klasę. Niektóre frameworki podklasują również klasy bez zauważania (Hibernate, Spring AOP z proxy CGLIB ...)
loose: dwa obiekty są równe, jeśli ich typy są "zgodne" i mają tę samą zawartość (semantycznie). Na przykład. dwa zestawy są równe, jeśli zawierają te same elementy, nie ma znaczenia, że jeden jest HashSet
, a drugi to TreeSet
(dzięki @veer za wskazanie tego).
To może być mylące. Weź dwa numery: LinkedHashSet
s (gdzie zamówienie reklamowe jest ważne w ramach umowy). Jednak ponieważ equals()
zajmuje tylko surowe Set
kontraktu uwzględnieniu rentowności porównania true
nawet dla oczywiście różnych obiektów:
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));
Zobacz także
Opcja "Comparable" określa "compareTo", a nie 'equals', przy okazji. – oldrinb
Och. dziękuję :) Edytowałem: D – hqt
Jak nazywa się ta książka? –