Ao usar a Optional
classe Java 8 , há duas maneiras pelas quais um valor pode ser agrupado em um opcional.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Entendo que Optional.ofNullable
é a única maneira segura de usar Optional
, mas por que Optional.of
existe? Por que não usar Optional.ofNullable
e estar sempre seguro?
java.util.Optional
- Ele está disponível se você estiver usando JDK 8 ou posteriorofNullable()
nomeadoof()
eof()
nomeadoofNotNull()
Respostas:
Sua pergunta é baseada na suposição de que o código que pode lançar
NullPointerException
é pior do que o código que não pode. Esta suposição está errada. Se você espera que o seufoobar
nunca seja nulo devido à lógica do programa, é muito melhor usá-Optional.of(foobar)
lo, pois você verá umNullPointerException
que indicará que seu programa tem um bug. Se você usarOptional.ofNullable(foobar)
efoobar
isso ocorrernull
devido ao erro, seu programa continuará silenciosamente funcionando incorretamente, o que pode ser um desastre ainda maior. Dessa forma, um erro pode ocorrer muito mais tarde e seria muito mais difícil entender em que ponto ele deu errado.fonte
Optional.of(foobar)
". Isso parece um pouco estranho - quando sabemos que o valor não será denull
forma alguma, por que não usar o próprio valor, em vez de agrupá-lo em umOptional
?Optional
método conforme exigido pela interface que você está implementando (provavelmente outros implementadores podem retornar um opcional vazio). Ou você deseja criar uma coleção / fluxo de opcionais, alguns dos quais são garantidos como não nulos e outros não. Ou você tem uma lógica condicional que cria um opcional em várias ramificações e na única ramificação você tem certeza de que não é nulo.null
neste caso, significa "Espero que o foobar esteja presente, mas devido a um erro, ele é nulo".Optional.isPresent() == false
significa que foobar não está presente, isto é, é esperado, comportamento legítimo.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
alist
espera-se que nunca contêmnull
valores ...Além disso, se você souber que seu código não funcionará se o objeto for nulo, você poderá lançar uma exceção usando
Optional.orElseThrow
fonte
String name = Objects.requireNonNull(nullName);
NullPointerException
quando o problema é claramente uma referência que énull
enquanto não deveria, seria um passo na direção errada.new NullNameException("meaningful msg")
Isso depende dos cenários.
Digamos que você tenha alguma funcionalidade comercial e precise processar algo com esse valor ainda mais, mas ter
null
valor no momento do processamento afetaria isso.Então, nesse caso, você pode usar
Optional<?>
.fonte
De qualquer forma, opcional deve ser usado principalmente para resultados de Serviços. No serviço, você sabe o que tem em mãos e retorna Optional.of (someValue) se tiver um resultado e retorna Optional.empty () se não tiver. Nesse caso, algum valor nunca deve ser nulo e ainda assim, você retorna um Opcional.
fonte