@zgrzyt:
Są wywoływane metody na obiekcie:
JakisObiekt jakisObiekt = new JakisObiekt();
jakisObiekt.get1().get2().get3().get4().get5();
i teraz jak sprawdzic nulla porzadnie zeby mi od razu pokazalo gdzie on jest nie bawiac sie w ify?
To zadaj sobie pytanie czemu w kolejnych get1()
, get2()
, get3()
mogą być null
? One są tam by design (i coś oznaczają), czy są tam przypadkiem i próbujesz robić jakieś programowanie defensywne?
Niezależe wywołania
Bo jeśli coś oznaczają, np ktoś zaprojektował ("zaprojektował" w cudzysłowie) API w którym null
symbolizuje np nieistniejący zasób, albo jakieś nieustawione pole; to ja nie radziłbym po prostu tego zignorować takim if
em albo map()
ami, tylko obsłużyć w jakiś sensowny sposób; bo rozumiem że każdy z tych get1()
, get2()
może mieć inny powód wystąpienia null
a? Bo możliwe że brak get2()
ma inną przyczynę niż get4()
, co należałoby obsłużyć w różny sposób.
Drzewo
Jeśli natomiast każdy z tych get1()
, get2()
symbolizuje jakąś zagnieżdżoną strukturę, np drzewo, system plików, etc. to nie wiem czy symbolizowanie null
em brakującego pola to dobry pomysł, ja raczej bym zrobił coś takiego:
try {
return root.get1().get2().get3().get4().get5();
}
catch (NieMaWartościException ex) {
return root; // albo coś innego
}
Wtedy każdy ten getX()
robiłby throw new NieMaWartości()
zamiast return null
.
Programowanie defensywne
Jeśli natomiast to ma być programowanie defensywne, tzn tam nie ma być null
a, i tylko obawiasz się że będzie, wiec robisz if
y... to nie rób. Jeśli tam nie ma być null
a, a przypadkiem się zjawi to niech rzuci NPE i tyle, po to jest. I potem szukaj przyczyn w tej metodzie która zwróciła null
a (bo przecież nie powinna), a nie w funkcji która go dostała.
Struktura
Jeśli jednak to jest struktura, a nie obiektówka, np
gameRoom.user.region.name
To wtedy faktycznie mógłbyś próbować chainować optionale, jeśli chcesz. Ale wtedy, jak już zostało zauważone, może to znaczyć żę została złamana hermetyzacja, no chyba że to jest model.