Nie ma?. operator w Javie, więc, jak zauważa Hari, musisz robić rzeczy "długo zdyszany" sposób. Można jednak twierdzić, że jest to dobre, ponieważ zniechęca do korzystania z wartości zerowych.
Na przykład, w kodzie OP, dlaczego ustawiasz wartość na null
, jeśli nie ma tam dziecka? Załóżmy, że jest to funkcja, a val zostaje zwrócony. To jest zapach kodu: to po prostu popycha wymóg dla kolejnego sprawdzenia wartości null dla użytkowników twojego kodu. Staje się niekończącym się cyklem zerowych kontroli, całkowicie zagracającym kod i mylącym logikę, ponieważ programiści konserwujący często nie mogą stwierdzić, czy jest to uzasadniona logika, czy też były programista paranoi po cichu ignoruje błędy. Don't mimic PHP!. Cytując z tego doskonałego rantu:
"W przypadku zrobienia czegoś bezsensownego lub przerwania z błędem, to (PHP) zrobi coś bezsensownego."
PHP dokonuje strasznego wyboru projektu. O wiele lepiej jest poradzić sobie z błędem niż zrobić coś bezsensownego.
Zamiast tego powinno być zadając pytania typu:
- Co to oznacza dla być zerowy? Czy to błąd programowania? Jeśli tak, wyrzuć wyjątek RuntimeException/IllegalArgumentException. Jeśli jest to krytyczny kod i "nie możesz zawieść", zapisz przynajmniej, że rysujesz coś podejrzanego, więc może zostanie naprawiony.
- Co zrobić, jeśli a.child.getValue() sama w sobie zwraca wartość null? W jaki sposób mój rozmówca poinformuje o różnicy między tą wartością zerową a wartością "a lub child is null" null? Nie mogą.
- Jeśli jest dobra wartość domyślna, użyj jej. Jeśli korzystasz z kolekcji lub macierzy, nie przekazuj wartości null jako "pustej". Przełóż
Collections.emptyXXX()
, np. an emptyList lub pusta tablica. Zamiast ustawiać ciąg na wartość null, należy rozważyć ustawienie go na pusty ciąg znaków ""
. BTW, to sprawia, że Twój hashCode(), equals(), and compareTo()
jest znacznie prostszy!
- Użyj Null Object Pattern.. Jeśli a jest instancją Foo, zdefiniuj statyczny, końcowy Foo.NULL, który ma dziecko, którego wartość sama jest czymś "nullish" - albo null albo "".
Czasami naprawdę nie można zrobić żadnej z tych rzeczy. Istnieją uzasadnione powody, dla których argumenty mają wartość null lub musisz pozwolić na kompatybilność wsteczną z poprzednim złym projektem lub biblioteką strony trzeciej. IMO, powinno to być rzadkie i powinieneś udokumentować, co się dzieje. I może powinieneś zwrócić coś innego niż zero (lub 0), aby to odzwierciedlić. Na przykład
/**
countPeople
@param node null means the foobar can't connect to the database,
@return Foobar.ERR_NO_DB if node is null
*/
w przykładzie OP, wygląda na to może być jakiś rodzaj węzła XML i interfejsy XML Java są ogromne i stworzenie dobrego obiektu NULL dla jednego z nich byłoby ogromnym przedsięwzięciem. (Hmm, może dobry mały projekt open source?). Jednak w takim przypadku prawdopodobnie będziesz często dzwonił pod numer a.child.getValue()
. Napisz małą funkcję użyteczną, aby obsłużyć to i obsłużyć wartości zerowe. Zamiast długich zniesionych czeków zerowych wszędzie, przynajmniej są one zamknięte w kilku metodach użytkowych. SUCHY. I, zapewne fakt, że kontrole są długo zdyszane, zachęciło cię do zrobienia lepszego projektu. Więc brak? operator był dobrą rzeczą, prawda? :-)
często uważany, ale nie. – MeBigFatGuy
Masz na myśli operację trójskładnikową? 'String val = (a! = Null && a.child! = Null)? a.child.getValue(): null; ' –
nie on oznacza operator Elvis?: – MeBigFatGuy