2015-07-29 10 views
116

Podczas używania klasy Java 8 Optional istnieją dwa sposoby zawijania wartości w opcjonalne.Dlaczego warto używać opcji Opcjonalnie.Opcji na Opcjonalne.Niewłączalne?

String foobar = <value or null>; 
Optional.of(foobar);   // May throw NullPointerException 
Optional.ofNullable(foobar); // Safe from NullPointerException 

Rozumiem Optional.ofNullable to jedyny bezpieczny sposób korzystania Optional, ale dlaczego Optional.of w ogóle istnieje? Dlaczego po prostu nie używać Optional.ofNullable i zawsze być po bezpiecznej stronie?

+1

proszę mi powiedzieć, który pakiet musi zaimportować, aby z niego skorzystać? – LoveToCode

+2

@LoveToCode 'java.util.Optional' - Jest on dostępny, jeśli używasz JDK 8 lub nowszy – whirlwin

Odpowiedz

154

Twoje pytanie opiera się na założeniu, że kod, który może rzucić NullPointerException jest gorszy niż kod, który może nie być. To założenie jest błędne. Jeśli spodziewasz się, że twoja foobar nigdy nie będzie pusta z powodu logiki programu, znacznie lepiej będzie użyć Optional.of(foobar), ponieważ zobaczysz NullPointerException, który będzie wskazywał, że twój program ma błąd. Jeśli użyjesz Optional.ofNullable(foobar), a foobar stanie się null z powodu błędu, Twój program będzie po cichu działał niepoprawnie, co może być większą katastrofą. W ten sposób błąd może wystąpić znacznie później i znacznie trudniej byłoby zrozumieć, w którym momencie poszło nie tak.

+47

" * Jeśli spodziewasz się, że twój foobar nigdy nie jest pusty z powodu logiki programu, znacznie lepiej jest użyć 'Opcjonalnie.of (foobar) '*". Wydaje się to nieco dziwne - kiedy wiemy, że wartość nie będzie miała wartości "null", to dlaczego nie użyć samej wartości zamiast owijać ją w "Opcjonalnym"? –

+27

@kocko, być może będziesz musiał zwrócić 'Opcjonalnie' z metody zgodnie z wymaganiami implementowanego interfejsu (prawdopodobnie inni implementatorzy mogą zwrócić puste opcjonalnie). Lub chcesz utworzyć kolekcję/strumień opcji, z których niektóre mają gwarantowaną wartość inną niż null, a inne nie. Lub masz logikę warunkową, która tworzy opcjonalne w kilku gałęziach i w pojedynczej gałęzi masz pewność, że ma wartość inną niż null. –

+19

Ponieważ Opcjonalnie oznacza, że ​​może być obecny lub nieobecny. Absent! = Null. 'null' w tym przypadku oznacza" oczekuję, że foobar będzie obecny, ale z powodu błędu jest pusty ". 'Optional.isPresent() == false' oznacza, że ​​foobar nie jest obecny, tzn. Jest to oczekiwane, zgodne z prawem zachowanie. – Buurman

Powiązane problemy