2014-11-22 30 views
5

Kiedy koduję, jestem sfrustrowany sprawdzeniami zerowymi. Zwłaszcza podczas kodowania struktur danych!Czy istnieje?. operator dla Javy do sprawdzania pustych wskaźników?

mam to zrobić jak

String val; 
if(a != null && a.child != null) 
    val = a.child.getValue(); 
else 
    val = null; 

Coś w tym rodzaju ...

Czy istnieje operator jak?. (który jest częścią C#) dla Javy, aby skrócić obciążenie?

С # Przykład:

String val = a?.child?.getValue(); 
+2

często uważany, ale nie. – MeBigFatGuy

+0

Masz na myśli operację trójskładnikową? 'String val = (a! = Null && a.child! = Null)? a.child.getValue(): null; ' –

+2

nie on oznacza operator Elvis?: – MeBigFatGuy

Odpowiedz

2

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:

  1. 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.
  2. 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ą.
  3. 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!
  4. 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? :-)

6

Nie

Jak większość rzeczy w Javie, trzeba to zrobić w sposób długo zdyszany. Hej, przynajmniej jest to bardziej czytelne - jeśli musisz zrobić kontrolę zerową, dlaczego nie uczynić tego wyraźnym i dobrze widocznym (grając tutaj adwokata diabła)

+1

W przypadku, gdy nie jest jasne z odpowiedzi: Przykład C# sprawia, że ​​zerowa kontrola * wyraźnie *, łatwo * jest widoczna *, a kod zdecydowanie bardziej * czytelny *. –

1

Nie ma takiego operatora w Javie. Najbliższy rzeczą mogę myśleć, że Java obsługuje, jest Yoda conditions, które pozwalają na sprawdzenie wartości względem stałego jak

if ("test".equals(str)) 

zamiast

if (str != null && str.equals("test")) 
+0

Co, jeśli nie znamy łańcucha "test"? –

+0

@sidkamaria Kiedy nie znasz "testu" 'String', nie możesz użyć warunków Yoda. –

+0

To nie jest dla mnie przydatne. W każdym razie dowiedziałem się czegoś nowego :) –

2

Operator ?. nie istnieje w Javie.

"Najbardziej" kompaktowy, co można zrobić, to trójoperandowy operator ?: które można "łańcuch":

String val = a != null && a.child != null ? a.child.getValue() : null; 

lub

String val = a == null ? null : a.child == null ? null : a.child.getValue(); 
+0

To, co robiłem ... albo używam instrukcji ** jeśli ** lub ** operatora trójskładnikowego **. W każdym razie dzięki :) –

2

Nie tam nie ma?. operator w JAVA. Możesz użyć operatora! = Do sprawdzenia, czy nie ma wartości null

String val = (a != null && a.child !== null) ? a.child.getValue() : null;