2015-05-10 6 views
35

szukam wszystkich standardowych klas Javy dla których compareTo() mogą powrócić 0 podczas equals() powraca false:Czy istnieją standardowe klasy Java z niespójnymi metodami compareTo() i equals()?

Comparable comparable1 = ???; 
Comparable comparable2 = ???; 

assert comparable1.compareTo(comparable2) == 0; 
assert !comparable1.equals(comparable2); 

Wiem tylko jedno: new BigDecimal("1.0") jest równa new BigDecimal("1") użyciu compareTo() ale nie równa użyciu equals(). Czy są jeszcze jakieś inne?

Interesują mnie wszystkie takie klasy, ale tylko z publicznego interfejsu Java API. Potrzebuję go do dostarczenia dokładnej dokumentacji interfejsu AssertJ's UnevenComparableAssert.

EDIT:

Dzięki @ErikVesteraas, udało mi się odtworzyć dodatkowy przykład:

Calendar calendar1 = new GregorianCalendar(0, 0, 0); 
Calendar calendar2 = new GregorianCalendar(0, 0, 0); 
calendar2.setLenient(false); 

Comparable comparable1 = calendar1; 
Comparable comparable2 = calendar2; 

assert comparable1.compareTo(comparable2) == 0; // compareTo compares along the timeline 
assert !comparable1.equals(comparable2); // equals compares state, leniency is different 
+1

Dobre pytanie, i o ile wiem przynajmniej, "BigDecimal" jest jedynym w JDK – fge

+1

Co do pytania, które właśnie usunąłeś, jaki jest tutaj przypadek użycia? Czy potrzebujesz wyczerpującej listy? –

+1

Pracuję nad AsssertJ i próbuję wymyślić jakiekolwiek inne przykłady oprócz "BigDecimal" do udokumentowania tej klasy: https://github.com/joel-costigliola/assertj-core/blob/master/src/main/java/ org/assertj/core/api/UnevenComparableAssert.java –

Odpowiedz

27

Wygląda na to, że istnieje kilka przykładów, ale niektóre nie są dobrze udokumentowane w kodzie lub JavaDoc. This blog post Stephena Colebourne podaje szczegółów, ale w skrócie następujące klasy są niezgodne z równymi:

Na przykład:

ObjectStreamField a = new ObjectStreamField("foo", String.class); 
ObjectStreamField b = new ObjectStreamField("foo", String.class); 
a.equals(b); // false, checks object equality 
a.compareTo(b); // 0 

Jak zauważył Olivier, Java 8 dodaje również java.time.zone.ZoneOffsetTransition

szczególności java.time.OffsetTime unika niespójności poprzez dodanie dodatkowych metod isAfter, isBefore i isEqual dla robią porównanie czasu linia/równości sprawdzanie .

10

Patrząc na "niezgodne z równymi" w klasach JDK, ja również java.time.zone.ZoneOffsetTransition

Powiązane problemy