Optionals
Usando e evitando nulls
NULL
O mal uso do null pode causar bugs de diversas raizes.
Null é ambíguo.
Raramente um retorno null faz sentido.
Map.get(key) pode retonar null em 2 casos:
O valor no mapa é null.
O valor não está no mapa.
Null pode significar um erro, sucesso, nada.
Utilizar QUALQUER coisa ao invés de null é mais claro.
Bom NULL
As vezes null é a melhor escolha.
Se pensarmos em uso de memória ou velocidade, o que é invevitável com array de objetos.
Mas no código de sua aplicação, ao contrário de uma biblioteca, é considerado um dos maiores causadores de confusão, dificuldades e bugs estranhos.
ex: quando um Map.get retorna null:
-
O valor pode estar ausente (absent)
-
O valor está presente mas está nulo
Casos especificos
Está tentando usar valores nulos em um SET
ou como a chave de um MAP?
- Não faça isso!
É mais claro e livre de desentendimentos, se for explicitado os casos especiais de null durante um lookup.
Casos eSpecificos
Quer usar null no valor de um MAP?
Deixe-o fora das entradas.
Sempre matenha separado o conjunto com valores não-null.
O melhor a ser feito é separar os casos onde há chaves desse tipo e
pensar melhor em qual o sentido das chaves null no ponto de vista
da sua aplicação.
Dia-a-DIA
Há muitos casos onde o programador usa nulo:
-Onde deveria haver um valor, mas não há.
- Valor não foi encontrado em uma consulta.
Optionals
Optionals são a forma de substituir uma referência nula de um objeto de um tipo específico por uma referencia não-nula.
O Optional pode conter uma referência não-nula
(Nesse caso dizemos que a referencia está present)
Ou uma referência nula
(Nesse caso dizemos que a referencia está absent)
Criando Optionals
Optional.of(T)
Cria um Optional de uma referência não-nula ou falha rapidamente.
Optional.abset()
Retorna absent do Optional de algum tipo (T)
Optional.fromNullable(T)
Cria uma referência Optional com um valor possivelmente nulo.
não-nulos -> present | nulos - > absent
query Methods
isPresent()
True se o optional contiver uma referencia não-nula.
get()
Retorna a instancia de T armazenada, essa referencia deve ser não-nula ou lançará IlegalStateException.
or(T)
Retorna o valor presente na instancia. Caso valor não esteja presente o valor default é retornado.
orNull()
Retorna o valor presente na instancia. Caso valor não esteja presente o valor null é retornado.
Query Methods
Existem mais métodos úteis na API Optional.
Consulte o JavaDoc para maiores informações.
QUal é o ponto?
Por um lado ganhamos a vantagem de conseguir nomear um valor nulo com a API Optional, mas a maior vantagem é ser a prova de idiotas.
Você é forçado a pensar nos casos de absent, pois você
constantemente terá que fazer um unwrap do seu Optional para endereçar os casos de nulo.
Usar nulls facilmente torna-se algo não memorizavel.
Citações
"Null sucks" - Doug Lea
(Java Concurrency API)
"I call it my billion-dollar mistake" - C.A.R. Hoare
(Inventor da referência nula)