Pesquisar este blog

terça-feira, 7 de outubro de 2014

Java 8 Optional - Evitando NullPointerExceptions

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 10
Optional<Integer> optIntValor = Optional.of(10);
//Sem valor
Optional<Integer> optIntVazio = Optional.empty();
Com 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.
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.
if(optIntValor.isPresent()){
            Integer valor = optIntValor.get();
        }                                     else {
            //Código    quando não existir valor
        }
O método isPresente retorna verdadeiro quando o objeto tiver um valor, e falso quando ele não tiver nenhum 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 {
            optIntVazio.orElseThrow(Exception::new);
        }catch(Exception e){
           
        }
Neste caso ele irá disparar uma Exception caso o optIntVazio não contenha nenhum valor.
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.

Usando o método orElseGet

O método orElse é bem útil quando vamos retornar um objeto que tenha um construtor simples, porém quando temos um objeto Optional que contenha um construtor com vários parâmetros podemos utilizar o método getOrElse que recebe um Supplier como parâmetro. 

Nenhum comentário:

Postar um comentário