2015-12-28 9 views
14

Próbuję utworzyć klasę krotki, która pozwala na strukturę podobną do tupeksu w Javie. Ogólny typ dla dwóch elementów w krotce to odpowiednio X i Y. Próbuję zastąpić poprawne wartości dla tej klasy.Objects.equals i Object.equals

Rzecz polega na tym, że obiekt Object.equals jest domyślnie porównywany na podstawie odniesień typu "==", więc nie jestem pewien, czy mogę go użyć. Zajrzałem do obiektów i tam jest równy(). Czy ten nadal porównuje na referencjach lub porównuje zawartość?

Szybko wyobrazić instrukcji return, jak coś takiego:

return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next); 

gdzie prev i następne są elementy krotki. Czy to działa?

+2

Możesz przeczytać kod źródłowy dla wbudowanych klas JRE. – chrylis

Odpowiedz

27

Różnica polega na tym, że Objects.equals() uważa dwie wartości zerowe za "równe". Kod pseudo odległość:

  1. Jeśli oba parametry null powrotu true
  2. jeżeli dokładnie parametr null powrotu false
  3. zwraca wynik wywoływanie metody pierwszego parametru equals() przekazując mu drugi parametr

To zachowanie oznacza, że ​​jest "zerowy bezpieczny".

+0

Punkt 2 jest nieprawidłowo udokumentowany. Kod to: 'return (a == b) || (a! = null && a.equals (b)); 'tak to faktycznie jest * jeśli ** pierwszy ** parametr to' null' return 'false' *. Jeśli drugi to 'null', twoje' równy' zostanie wywołane z parametrem 'null'. Które mogą być interesujące, jeśli zaimplementowałeś "równa się" źle, w zależności od 'Objects.equals' jedną null za daleko, tak jak ja. –

0

Objects.equals po prostu wywołuje swoją pierwszą metodę argumentów .equals. W java, jeśli chcesz móc testować równość w instancjach klasy, którą wykonałeś, musisz zastąpić metodę równości. Funkcja instance.equals() używa tylko ==, jeśli ten typ instancji nie zastępuje metody equals.

+1

Nie zapomnij także przesłonić 'hashCode' – Robert

+2

Nie, nie robi tego. – Bohemian

Powiązane problemy