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)
Made with Slides.com