Estou atrasado para o jogo, mas para o que vale a pena, quero adicionar meus 2 centavos. Eles vão contra o objetivo do projetoOptional
, que é bem resumido pela resposta de Stuart Marks , mas ainda estou convencido de sua validade (obviamente).
Use opcional em qualquer lugar
Em geral
Eu escrevi um postOptional
inteiro sobre o uso, mas basicamente se resume a isso:
- crie suas aulas para evitar a opção sempre que possível
- em todos os casos restantes, o padrão deve ser usar em
Optional
vez denull
- possivelmente faça exceções para:
- variáveis locais
- retornar valores e argumentos para métodos privados
- blocos de código críticos de desempenho (sem suposições, use um criador de perfil)
As duas primeiras exceções podem reduzir a sobrecarga percebida das referências de quebra e descompactação Optional
. Eles são escolhidos de forma que um nulo nunca possa legalmente passar um limite de uma instância para outra.
Observe que isso quase nunca permitirá Optional
s em coleções, o que é quase tão ruim quanto null
s. Apenas não faça isso. ;)
Em relação às suas perguntas
- Sim.
- Se sobrecarregar não for uma opção, sim.
- Se outras abordagens (subclasse, decoração, ...) não são uma opção, sim.
- Por favor não!
Vantagens
Fazer isso reduz a presença de null
s na sua base de código, embora não os erradique. Mas esse nem é o ponto principal. Existem outras vantagens importantes:
Esclarece a intenção
O uso Optional
expressa claramente que a variável é, bem, opcional. Qualquer leitor do seu código ou consumidor da sua API será surpreendido com o fato de que talvez não haja nada lá e que uma verificação seja necessária antes de acessar o valor.
Remove incerteza
Sem Optional
o significado de uma null
ocorrência não é claro. Pode ser uma representação legal de um estado (consulte Map.get
) ou um erro de implementação, como uma inicialização ausente ou com falha.
Isso muda drasticamente com o uso persistente de Optional
. Aqui, a ocorrência de já null
significa a presença de um bug. (Como se o valor estivesse faltando, um Optional
teria sido usado.) Isso torna a depuração de uma exceção de ponteiro nulo muito mais fácil, pois a pergunta do significado disso null
já está respondida.
Mais verificações nulas
Agora que nada pode ser null
mais, isso pode ser aplicado em qualquer lugar. Seja com anotações, asserções ou verificações simples, você nunca precisa pensar se esse argumento ou esse tipo de retorno pode ser nulo. Não pode!
Desvantagens
Claro, não há bala de prata ...
atuação
A quebra de valores (especialmente primitivos) em uma instância extra pode prejudicar o desempenho. Em laços apertados, isso pode se tornar perceptível ou até pior.
Observe que o compilador pode contornar a referência extra para vidas úteis de Optional
s. No Java 10, os tipos de valor podem reduzir ainda mais ou remover a penalidade.
Serialização
Optional
não é serializável, mas uma solução alternativa não é muito complicada.
Invariância
Devido à invariância de tipos genéricos em Java, certas operações se tornam complicadas quando o tipo de valor real é empurrado para um argumento de tipo genérico. Um exemplo é dado aqui (consulte "Polimorfismo paramétrico") .
Map<Character, String>
. Se não há substituição posso usar isto:Optional.ofNullable(map.get(c)).orElse(String.valueOf(c))
. Observe também que o opcional foi roubado da goiaba e possui uma sintaxe muito melhor:Optional.fromNullable(map.get(c)).or(String.valueOf(c));