Não use null, use Optional
Como você apontou, um dos maiores problemas null
do Java é que ele pode ser usado em qualquer lugar , ou pelo menos para todos os tipos de referência.
É impossível dizer que poderia ser null
e o que não poderia ser.
Java 8 introduz um melhor padrão muito: Optional
.
E exemplo da Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Se cada um desses itens puder ou não retornar um valor bem-sucedido, você poderá alterar as APIs para Optional
s:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Ao codificar explicitamente a opção no tipo, suas interfaces ficarão muito melhores e seu código ficará mais limpo.
Se você não está usando o Java 8, pode ver no com.google.common.base.Optional
Google Guava.
Uma boa explicação da equipe do Guava: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Uma explicação mais geral das desvantagens de null, com exemplos de vários idiomas: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nonnull, @Nullable
O Java 8 adiciona essas anotações para ajudar as ferramentas de verificação de código como IDEs a detectar problemas. Eles são bastante limitados em sua eficácia.
Verifique quando faz sentido
Não escreva 50% do seu código marcando nulo, principalmente se não houver nada sensato que seu código possa fazer com um null
valor.
Por outro lado, se null
puder ser usado e significar alguma coisa, certifique-se de usá-lo.
Por fim, você obviamente não pode remover null
do Java. Eu recomendo fortemente substituir a Optional
abstração sempre que possível e verificar null
as outras vezes em que você pode fazer algo razoável sobre isso.