Java 8 Optional - Evitando NullPointerExceptions
Com a introdução do Optional no java, podemos construir métodos evitando aqueles checks infinitos por variáveis nulas.Definição do Optional
Optional é uma classe do pacote java.util, ela é tipada, e devemos usá-la no lugar do null. Claro que não poderemos usá-la em qualquer substituição ao null, como esta não é uma classe serializável, e por isso não é indicado o seu uso na camada de modelo, DTO e parâmetros de métodos ou construtores.Recomenda-se usá-la como retorno de métodos onde existe a possibilidade de retornarmos nulo. Para construir um valor Optional usamos o método of da seguinte forma:
//Valor numérico Inteiro 10Com isto construímos dois objetos opcionais, sendo o primeiro deles com um valor 10 e o segundo, sem nenhum valor o que é equivalente ao null.
Optional<Integer> optIntValor = Optional.of(10);
//Sem valor
Optional<Integer> optIntVazio = Optional.empty();
Tendo um Optional como retorno de um método, como recuperamos o valor contido nele?
Existem algumas formas de se fazer isso, desde um simples get:
Integer valor = optIntValor.get()O que recupera o valor do objeto para a nossa variável, mas e se o objeto não tiver nenhum valor? Bom neste caso este método irá disparar uma exceção do tipo NoSuchElementException.
Para evitar esta exceção podemos usar algumas estratégias diferentes descritas abaixo:
Verificar o valor antes
Aqui vamos usar a mesma estratégia que usamos nas variáveis que podem ser nulas.O método isPresente retorna verdadeiro quando o objeto tiver um valor, e falso quando ele não tiver nenhum valor.if(optIntValor.isPresent()){
Integer valor = optIntValor.get();
} else {
//Código quando não existir valor
}
Bom até ai fica a impressão que só estamos adicionando código inútil e não estamos fazendo nada de diferente do que fazíamos com o null
Variáveis com valores padrão
Existem casos onde os valores das nossas variáveis podem assumir algum valor, quando não houver nenhum valor atribuído a ela. Por exemplo na criação de uma conta bancária, se não houver nenhuma operação o saldo desta conta será 0, e como fazemos isso com optional no java?optIntValor.orElse(0);O método orElse foi criado para suprir estes casos, quando o optional contiver um valor, ele retorna o valor do optional, mas se ele for vazio, ele irá retornar o valor passado como argumento do método. No caso acima ele irá retornar 10, pois na construçao do objeto optIntValor foi setado o valor 10. Caso este método seja aplicado ao outro objeto construído no início deste post:
optIntVazio.orElse(0);Neste caso, ele iria retorna 0, pois o objeto optIntVazio não contem nenhum valor associado a ele.
Disparando uma exceção se o objeto for vazio
Um outro caso muito comum, é ter que disparar uma exceção caso o valor do objeto seja nulo. Não confundir isso com o construtor dos objetos onde geralmente disparamos uma IllegalArgumentException.try {Neste caso ele irá disparar uma Exception caso o optIntVazio não contenha nenhum valor.
optIntVazio.orElseThrow(Exception::new);
}catch(Exception e){
}
Note que tem alguma coisa nova no argumento deste método, ele recebe um objeto do tipo Supplier, explicado aqui, que neste caso é a Exception::new.
Nenhum comentário:
Postar um comentário