Czy powinno się zwracać Optional?

1

Dostałem komentarz do PR co by zmienić return empty() na return null i użyć ofNullable wyżej.
Kto tu zwariował?

6

Czy powinno się zwracać Optional?

Tak

Dostałem komentarz do PR co by zmienić return empty() na return null i użyć ofNullable wyżej.
Kto tu zwariował?

Optional jest zje'any i nie jest serializowalny. Dlatego Oracle zaleca nie używanie go w API. Oczywiście prawie nikt nie używa wbudowanej w Javę serializacji więc nie jest to problemem, jednak Sonar i podobne narzedzia mogą mieć domyslnie regułę żeby Optionala nie używać w API

Najlepiej uzywać Option z Vavr, no ale taka decyzja jest pewnie poza twoim zasięgiem.
Jak denerwują cię zwariowani programiści Javy proponuję przekwalifikować się na programistę Kotlina lub Scali. Tam ludzie lepiej rozumieją ideą używania Option. (Nie mówiąc już o tym że w Kotlinie Option jest wbudowany w język jako ?)

4

Moje rozumienie użycia Optional jest takie, że po pierwsze informuje o możliwości wystąpienia wartości null, dopiero w drugim rzędzie pozwala coś z nią zrobić. Zwrócenie null uważam za raka.

1

W sumie zależy jak używasz, bo czym różni się

if (obj != null)

od

if(obj.isPresent())

Pominam rakowość metody isPresent. Ogólnie optional wymusi Ci obsługę nulla - więc jeśli tego potrzebujesz, to zwracaj optionala. Byle byś go nie używał w API.

8

Albo powiedz w PR , że nie - odeślij do nas jako szanowanego grona eksperckiego. Jeśli ten z PR to niestety ktoś z wyższą siłą przebicia - betonowy architekt - to szykuj sobie awans zewnętrzny.
(jak ktoś ma z problem Optionallami to dalej może być już tylko gorzej - pewnie gettery i settery też robicie, ew. lomboczycie).

1

Tak na serio to odpowiedź brzmi: to zależy. Zarówno VAVRowy Option, jak i Optional są cięższe niż normalny nullcheck (zwłaszcza korzystanie z filtrów, mapowania itp.) - dlatego w sytuacji gdy mocno walczysz o wydajność jest to jak najbardziej normalne.

W takim typowym kodzie crudowym liczy się bardziej czytelność kodu i wtedy Optional zwracać jak najbardziej można i warto, jeśli tylko obiekt lata sobie w obrębie VMki. Natomiast raczej głupim pomysłem jest korzystanie z Optionala jako pola w klasie.

3

Natomiast raczej głupim pomysłem jest korzystanie z Optionala jako pola w klasie.

2
dargenn napisał(a):

W sumie zależy jak używasz, bo czym różni się

if (obj != null)

od

if(obj.isPresent())

Pominam rakowość metody isPresent. Ogólnie optional wymusi Ci obsługę nulla - więc jeśli tego potrzebujesz, to zwracaj optionala. Byle byś go nie używał w API.

No różnica jest taka że jak masz Optionala to masz jawna informacje.
A od Javy 11 zdaje się jest metodą ifPresentOrElse która przyjmuje consumera dla obecnej wartości i runnable który jest uruchomiany jeśli Optional jest pusty.

0

Było jakieś uzasadnienie?

1
dargenn napisał(a):

W sumie zależy jak używasz, bo czym różni się

if (obj != null)

od

if(obj.isPresent())

Pominam rakowość metody isPresent. Ogólnie optional wymusi Ci obsługę nulla - więc jeśli tego potrzebujesz, to zwracaj optionala. Byle byś go nie używał w API.

No ale jak ktoś nauczy się używania Optional to if(obj.isPresent()) jest rzadkim przypadkiem. IMHO o wiele częściej używa się map orElse(T other) czy orElseGet(Supplier<? extends T> supplier) albo stream(). Przynajmniej z tego co pamiętam programowanie w Javie :P

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

Robot: GrapeshotCrawl