[MÚSICA] [MÚSICA] Olá todos! Meu nome é Eduardo Guerra. Estamos no Curso de Padrões de Projeto e hoje eu vou falar aqui sobre o padrão Null Object. Vamos fazer hands on aqui e eu vou mostrar para vocês, na prática, o uso do Null Object. Então, eu tenho essa classe aqui, eu já estou com o código mais ou menos pronto. Eu tenho aqui, vou mostrar para vocês, eu tenho aqui o item, certo? Olha aqui, 150. Eu tenho esse método aqui, item quantidade. No caso aqui eu estou querendo o preço pela quantidade dois. O valor vai ser 300. E ele também tem aqui toString que ele imprime o nome do produto com o preço. O quê que acontece? Eu tenho essa classe aqui olha, eu tenho essa opção aqui de, quando eu crio o item, eu passar para ele o desconto percentual. No caso aqui, eu tenho aqui dentro da classe item, para mostrar para vocês, eu tenho aqui essa variável desconto. Se eu olhar, eu tenho construtor que aceita com e construtor sem. Então, quando ele tem desconto percentual, ele vai dar aqui dez por cento de desconto. Então, com dois de quantidade, vai ser duzentos e sessenta. E aqui eu tenho o tênis, o valor dele, já aplicado o desconto. E eu tenho aqui o desconto absoluto, aí é dez, vai ser dez do valor, idependente do preço. Então, para dois vai dar 280, porque ele vai tirar dez de cada e aqui, na hora que ele manda imprimir, vai dar 140. E eu tenho a minha interface desconto, que ele recebe o valor original e retorna o valor com desconto. E eu tenho as duas implementações que é o desconto absoluto, que ele subtrai, e o desconto percentual, que ele tira ali o percentual do preço. Bom, qual que é o problema aqui? Se a gente olhar a classe item, ele pode ter o desconto ou pode não ter. Então, você vê aqui, se o desconto for diferente de null, então o toString tem que ser desse jeito, tem que dar o desconto. Se eu não fizer esse if aqui, ele vai dar null pointer exception. A mesma coisa aqui no preço quantidade. Quando a gente olha esses testes aqui para ver se é null ou não, a gente a lembra do null object. Então, o quê que a gente vai fazer? A gente vai tentar criar null object para substituir essas chamadas de null. E aqui os nossos testes, olha, eu vou executar aqui, para vocês verem que está funcionando. Ele tem que continuar funcionando. Então, vamos lá. O quê que eu vou fazer? Eu vou criar aqui uma classe que eu vou chamar de sem desconto. E vai implementar a interface desconto. Eu vou vir aqui, desconto, ok. Está ali. Então, como é que eu dou o desconto quando eu não tenho o desconto? Eu retorno o próprio valor, sem remover nada. Então, eu vou estar retornando o valor original. Salvo aqui. Beleza. Essa é a minha classe de desconto sem desconto, que é o nome do projeto, é o desconto sem desconto. Então, o que eu vou fazer? Na minha classe item aqui, eu vou inicializar o meu desconto com o sem desconto. [SEM_AUDIO] Se eu fizer isso e parar para pensar, eu vou ver que, essa parte debaixo aqui, o desconto nunca vai ser null, porque eu já estou inicializando ele ali. Então, essa parte aqui de baixo nunca vai ser chamada. Se eu rodar o teste aqui, eu acho que eu consigo tirar esse if. Então, vamos rodar o teste aqui de novo e ver se continua funcionando. Continuou. Então, eu vou tentar tirar o if aqui. Vou tirar de primeiro, se funcionar, a gente tira do outro. Salva aqui. Roda o teste de novo. Funcionou. Tira aqui de novo. Roda aqui de novo. Opa. Funcionou. Então, a gente vê que usando no object a gente pôde tirar aquele monte de verificação de null que a gente tinha aqui dentro da classe, tornando ela muito mais simples. Lógico que aqui era exemplo ilustrativo, só para demonstrar para vocês o uso do padrão. Mas numa classe que, às vezes, tenha isso muitas vezes ou que tenha isso aí várias partes do sistema, isso daqui pode fazer uma enorme diferença. Certo? Então, muito obrigado por assistir. Continue assistindo o nosso curso. [MÚSICA] [MÚSICA]