Alternatywa do Optionali w fieldach

0

Trafiłem na trochę stary projekt, okazało się że jest kilka klas w których ktoś uznał za odpowiednie zrobić fieldy typu Optional<>. IntelliJ od razu krzyczy że "possible bad practice". Troszkę się z tym zgadzam, niby przecież intencja optionali była inna, ale z drugiej strony - zacząłem się zastanawiać - w sumie nie ma alternatyw. To znaczy, najlepiej by zrobić immutable klasę, albo zastosować inne wzorce, ale nie ma na to czasu. Mógłbym też old-school'owo trzymać albo instancję also nulla, ale tak na prawdę to to się niczym nie różni od takiego optionala.

Any ideas?

0

**Option **z vavr najlepiej. Albo **Optional **z guavy. Albo olać intellij, tylko **Optional ** z jdk jest nieserializowany, co może kiedyś strzelić (ale nie musi).

0
jarekr000000 napisał(a):

**Option **z vavr najlepiej. Albo **Optional **z guavy. Albo olać intellij, tylko **Optional ** z jdk jest nieserializowany, co może kiedyś strzelić (ale nie musi).

No dobra, tylko że one wszystkie (łącznie z nullami) są ze sobą tożsame.

0

A kto Ci tak powiedział? null jest tożsamy z Optionalem? niby czemu? Logicznie Optionale służą do podobnych rzeczy, ale po prostu nie są tak niebezpieczne i łatwiej się komponują.

0
jarekr000000 napisał(a):

A kto Ci tak powiedział? null jest tożsamy z Optionalem? niby czemu? Logicznie Optionale służą do podobnych rzeczy, ale po prostu nie są tak niebezpieczne i łatwiej się komponują.

Po pierwsze to stosujesz odciąganie dyskutanta na poboczy tor. Pytanie dotyczyło alternatyw dla Optional<>a, a nie różnic z nullem.

Po drugie, to żadna z tych różnic które wymieniłeś mnie nie przekonuje. Jedyne co daje Optional to to że nie dostaniesz NPE (bo musisz zrobić ifPresent(), a sam get()a bez checka nie przejdzie, bo każde IDE od razu się przyczepi), ale co z tego skoro jak optional będzie .empty() to ustalenie czemu jest empty będzie tak samo trudne jak ustalenie czemu coś jest nullem (zwłaszcza jak się korzysta z ofNullable()). Więc z punktu widzenia debuga to jeden pies. Optional to fajne podejście funkcyjne, ale that's it.

Wracając, znacie jakieś alternatywy które nie są kopią 1:1 optionala ALBO nie są nullem?

1
TomRiddle napisał(a):
jarekr000000 napisał(a):

A kto Ci tak powiedział? null jest tożsamy z Optionalem? niby czemu? Logicznie Optionale służą do podobnych rzeczy, ale po prostu nie są tak niebezpieczne i łatwiej się komponują.

Po pierwsze to stosujesz odciąganie dyskutanta na poboczy tor. Pytanie dotyczyło alternatyw dla Optional<>a, a nie różnic z nullem.

Po drugie, to żadna z tych różnic które wymieniłeś mnie nie przekonuje. Jedyne co daje Optional to to że nie dostaniesz NPE (bo musisz zrobić ifPresent(), a sam get()a bez checka nie przejdzie, bo każde IDE od razu się przyczepi), ale co z tego skoro jak optional będzie .empty() to ustalenie czemu jest empty będzie tak samo trudne jak ustalenie czemu coś jest nullem (zwłaszcza jak się korzysta z ofNullable()). Więc z punktu widzenia debuga to jeden pies. Optional to fajne podejście funkcyjne, ale that's it.

Wracając, znacie jakieś alternatywy które nie są kopią 1:1 optionala ALBO nie są nullem?

Ale przeznaczeniem Optional'i nie jest przekazanie informacji dlaczego coś jest nullem, tylko, że coś może być ale niekoniecznie musi. W tym przypadku nie interesuje Cię dlaczego tego czegoś nie ma. Jeśli chcesz mieć informację o takich sprawach to możesz używać Vavr'owego Either do którego możesz dodać takie informacje

0
TomRiddle napisał(a):

Po drugie, to żadna z tych różnic które wymieniłeś mnie nie przekonuje. Jedyne co daje Optional to to że nie dostaniesz NPE (bo musisz zrobić ifPresent(), a sam get()a bez checka nie przejdzie, bo każde IDE od razu się przyczepi), ale co z tego skoro jak optional będzie .empty() to ustalenie czemu jest empty będzie tak samo trudne jak ustalenie czemu coś jest nullem (zwłaszcza jak się korzysta z ofNullable()). Więc z punktu widzenia debuga to jeden pies. Optional to fajne podejście funkcyjne, ale that's it.

Sorry - kompletenie inaczej rozumiem twoje pytania. Optioanal z guavy i Optional z VAVR są mniej więcej tożsame (z vavr jest dużo ładniejszy, guavowy trochę utknął historycznie). Optional z jdk - to taka zepsuta wersja powyższych, ale i tak nadal lepszy od null-i. Nulle po prostu są minami.

geta z Optiona/Optionala się nie stosuje o ile nie trzeba. Może tu lezy pies pogrzebany. Jeśli stosujesz .get to przeważnie znaczy, że robisz to źle.
(dobrze jest map, flatMap, orElse itp).

Co do alternatywy, która pokazuje CO się stało - to dokładnie wyzej wspomniany Either.

1 użytkowników online, w tym zalogowanych: 0, gości: 1