Jak zabezpieczacie przed NPE?

0
@Getter
Entity {
  Status status;
}
@Getter
Status {
  String value;
}
Entity e = repo.getEntity();
e.getStatus().getValue(); // if e.status == null then NPE exception

czy użycie Optional.ofNullable(e).map(Entity::getStatus).map(Status::getValue).orElse(null) jest dopuszczalne?

0

czy użycie Optional.ofNullable(e).map(Entity::getStatus).map(Status::getValue).orElse(null) jest dopuszczalne?

Tak

0

A nie obciąża to gc? Za każdym razem chyba musi alokować taki obiekt sobie.

1

czy użycie Optional.ofNullable(e).map(Entity::getStatus).map(Status::getValue).orElse(null) jest dopuszczalne?

może i tak, ale śmierdzi na kilometr

3

Btw skoro wiesz, że ten status może być pusty to nie lepiej od razu Optionala zawsze zwracac ?

@Getter
Entity {
  Optional<Status> status;
}
@Getter
Status {
  String value;
}

Pytanie jeszcze czy wartość statusu może być nullem bo wtedy to bardziej ->

Optional.ofNullable(e).flatMap(e -> Optional.ofNullable(e.getStatus())).map(Status::getValue).orElse(null)
1

Odpowiedź @Schadoow mi się podoba.
Najlepiej przyjąć, że status nie może być nullem i się nie zabazpieczać. NPE to twój przyjaciel - nie uciekaj od niego.
Jeśli z jakiegoś powodu jednak Entity może nie mieć statusu - wtedy pakujemy w Optional... a najlepiej w Option z vavra. Optional javowy jest trochę zrypany i (między innymi) nieserializowalny, wrzucenie do domeny jako pole powoduje "burczenie" wielu narzędzi do analizy kodu oraz wysypywanie się niektórych frameworków. (czasem nie wiem co jest gorsze - ten porypany Optional, czy frameworki).

3
Schadoow napisał(a):

Pytanie jeszcze czy wartość statusu może być nullem bo wtedy to bardziej ->

Optional.ofNullable(e).flatMap(e -> Optional.ofNullable(e.getStatus())).map(Status::getValue).orElse(null)

Chyba nie wiesz jak zrypaną implementację ma Optional :P flatMap(e -> Optional.ofNullable(e.getStatus())) jest równoważne map(e -> e.getStatus()). Optional Nie jest implementowany na klasach Some/None tylko na wewnętrzne pole które może być nullem

2

A nie obciąża to gc? Za każdym razem chyba musi alokować taki obiekt sobie.

To zależy. Zasadniczo nic nie musi alokować (mimo, że mogłoby się tak wydawać).
Najlepiej się nie przejmować do czasu, aż musisz się przejmować - wtedy odpalasz profilera i sprawdzasz co jest problemem.
W typowych porojektach szansa, że problemem wydejnościowym będzie ten optional jest nikła.

0

Przydała by się opcja w lomboku by można było ustawić @Gettery by zwracały referencję opakowaną w Optional... https://github.com/rzwitserloot/lombok/issues/1957
Będzie trzeba ręcznie dorobić.

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