2013-06-04 18 views
7

Właśnie przeczytałem w efektywnej Javie, że piątą zasadą metody equals() jest to, że wszystkie obiekty muszą być niejednakowe do null. Książka mówi dalej, że niektóre klasy pisane przez programistów temu zapobiec stosując wyraźną próbę dla null:Wymóg lub zasada nieważności

public boolean equals(Object o){ 
    if (o == null) 
     return false; 
    ... 
} 

Według Effective Java, powyższy not null test jest zbędny. Jednak moje pytanie brzmi: dlaczego więc tak wielu programistów testuje ten wymóg nieważności?

+3

Nie można ufać, że nikt nigdy nie wyśle ​​obiektu zerowego ... – vikingsteve

Odpowiedz

8

Można to zrobić za pomocą instanceof testu:

public boolean equals(Object o){ 
    if (!(o instanceof MyObject)) 
     return false; 
    ... 
} 

null nie jest przypadkiem niczego, tak to działa.

+0

zdecydowanie lepiej odpowiedzieć +1 – stinepike

+1

Teraz jest fajnie. Tak oczywiste, że nigdy o tym nie wiedziałem. +1, zrobiłbym +2, gdybym mógł. – Fildor

+0

Oczywiście, to ma sens. Korzystając z testu instanceof, automatycznie sprawdzamy, czy nie jest on pusty od razu w teście equals(). – blackpanther

2
Object firstObject = null; 
secondObject.equals(firstObject); 

Jak można temu zapobiec? jeśli nie zaznaczysz wartości NULL przed użyciem, spowoduje to awarię. Myślę, że będzie trzeba także sprawdzić typ klasy jak po

 if (other == null || other.getClass() != this.getClass()) { 
      return false; 
     } 
+2

W rzeczywistości nie trzeba tego sprawdzać. Możemy użyć instanceof, ponieważ jest to zalecana metoda w efektywnej Javie. – blackpanther

+0

Tak, oczywiście, odpowiedź Jonasa wyraźnie to wyjaśniła. Moja odpowiedź jest alternatywna, jeśli nie użyłeś instanceof – stinepike

0

Aby zapobiec NullPointerException gdy equals() nazywa.

0

możliwych powodów, aby sprawdzić:

starych przyzwyczajeń z innych języków

nie są zaznajomieni z zasadą pan wspomniał

bibliotek, które mogą rzucać wyjątki zerowe wskaźnik (nie można zagwarantować, że ktoś inny nie zrobił czegoś głupiego!)

jeśli masz kilka zagnieżdżonych poleceń, które wymagają oceny tylko dla niezerowej instancji twojego obiektu, możesz pominąć

0

Istnieje wiele praktyk sugerowanych w branży, aby uniknąć niepotrzebnych kontroli lub pułapek w kodzie, ale fakt, że błędy mogą się zdarzyć lub zdarzają się sytuacje, których nie można kontrolować, takich jak dane pochodzące z jakiegoś systemu strony trzeciej posiadającego wartości, którym brakuje systemu. oczekując, że kontrole będą wymagane. Świat nie jest idealny!

Powiązane problemy