[MÚSICA] [MÚSICA] Olá a todos, aqui é Eduardo Guerra e estamos no curso de Desenvolvimento Ágil com Java Avançado e chegamos aqui no último módulo da parte de generics e a gente vai falar pouquinho sobre quando utilizar generics. É recurso bem interessante da linguagem Java que foi adicionado aí no Java 5 e assim, a gente às vezes sabe como utilizar mas não sabe quando utilizar. Então hoje a gente vai falar pouquinho aí sobre alguns cenários de utilização dos generics que são mais comuns. Certo? Bom, o primeiro tipo, que acho que seria o mais imediato, que a gente está mais acostumado, é para a estrutura de dados. Então a gente vê aí que os generics, ele vastamente utilizado aí na page coleções, por uma lista, para mapa, aí a gente percebe que para essa utilização de estrutura de dados, a gente poder dizer, é uma lista, é uma cesta, é uma pilha de alguma coisa, a estrutura de dados que ela basicamente organiza o dado, mas seja ele quaisquer, ou seja, ele pode guardar qualquer classe, a ideia de você utilizar o tipo genérico é que quando você cria, você define uma variável com aquele compara uma determinada classe, você pode definir o tipo genérico e isso vai tornar o seu código mais seguro tanto para o momento de inserir os objetos daquela classe, quanto do momento que você for recuperar, você não vai ter risco aí de ter class crash exception tempo de execução. Então exemplo que a gente pode ver aí seria essa interface Pilha, o famoso Stack que todo mundo já deve ter visto aí cursos aí de ciência da computação, engenharia da computação, na parte de estrutura de dados, então, por exemplo, é exemplo parecido com o que a gente viu na aula da sexta, então a pilha, a gente pode empilhar, a gente pode desempilhar, a gente pode ver o que está no topo, e a gente quer saber se ela está vazia ou não. Então a gente pode utilizar o tipo genérico para, o mesmo tipo que a gente empilhar, ser os tipos que a gente vai receber quando desempilhar, e que a gente recebe quando a gente está olhando o topo. Então a pilha de E, ou empilha recebe E, o desempilha retorna E e o topo também retorna E. Outro uso de genéricos é para a gente manter a consistência entre os parâmetros e retornos de uma classe. Às vezes, por exemplo, você não tem uma estrutura de dados, mas você tem uma classe, você fala assim, se o cara criar objeto para ele passar para método, usuário, então o outro método também tem que retornar o usuário. Bom, então vamos ver exemplo mais prático para a gente entender como funcionaria isso. Imagine que eu defina uma interface que eu queira definir para classes que vão definir telas do meu sistema, mais especificamente essas telas que têm formulário e uma tabela. Então por exemplo, o que é que acontece, eu tenho ali, não faz sentido eu ter formulário de uma classe e ter uma tabela de outra classe, certo? Então por isso, o que é que eu fiz, eu criei essa interface com tipos genéricos de forma a tornar consistente, ou seja, eu posso como eu estou usando tipo genérico, eu posso ter ali formulários para qualquer classe, porém essa classe da qual eu tenho formulário, ela no momento que eu defino o tipo genérico da classe, ele tem que ser o mesmo ali entre os métodos. Não faz sentido eu adicionar uma classe no formulário e receber de volta, na hora que eu estou recuperando uma classe diferente ou ter uma lista de uma classe diferente, pelo menos não nesse contexto. Então eu criei ali a classe FormTabela e o método adicionaNoForm, ele recebe o tipo genérico E e o recuperaDoForm, ele retorna o tipo genérico E, ou seja, a mesma coisa que eu colocar no formulário eu tenho que pegar de volta. E eu tenho ali, por exemplo, método que "seta" a lista da tabela, e ele também recebe uma lista de E, mantendo aí essa consistência entre esses métodos. Eu vejo, por exemplo, também muito comum utilizar o tipo genérico downs, para os objetos persistirem no banco de dados, ou seja, se você está criando uma classe para inserir, atualizar, recuperar, recuperar uma lista do banco de dados, então a ideia é que aquela classe lide com uma mesma entidade, como por exemplo usuário, produto e aí todos os métodos, no momento que você definir tipo genérico, todos os métodos vão ser ali os mesmos, vai uniformizar ali a utilização daquele [iii]. Por fim, outro uso que particularmente eu faço bastante de tipos genéricos é quando às vezes você tem dois tipos de classe que se relacionam, eu chamo isso de hierarquias paralelas, e eu quero que o tipo de uma, o tipo genérico de uma dessas, de desses lados, tenha que combinar com o tipo do outro, para que eu não relacione classes que não tenham nada a ver. Vamos ver exemplo prático, que eu também acho que fica mais fácil de entender. Então imagine que eu tenho aqui essa classe produtor, que ela tem tipo genérico e ele vai produzir o E, certo, e aí lá cima eu tenho a classe consumidor, que ele tem esse método consumir, ele consome o E e ele também eu posso adicionar nele produtores de E. O que é que vai acontecer? Se eu não tiver esse tipo genérico, eu teria ali objetos, objects ali no lugar do E, eu poderia ter cara que produz, sei lá, alface e aí adicionar cara que só consome chocolate. Não ia dar certo, se bem que seria mais saudável, mas não daria certo. Então o que é que eu faço? Dessa forma eu consigo amarrar que o consumidor de E, ele só receba produtores de E. Então se eu tiver consumidor de chocolate, eu só vou receber produtor de chocolate. Se eu tiver consumidor de alface, eu só vou receber produtores de alface. Então é uma forma de amarrar essas classe paralelas de forma a não ficar muito, não possibilitar que uma classe que produza uma coisa seja adicionada, ou se relacione com uma outra que espera receber outra coisa. Certo? Então espero ter dado uma luz aí algumas situações, às vezes é difícil a gente cobrir todas, porque programação a nossa criatividade é o limite, mas espero que com essa aula eu tenha deixado pouco mais claro alguns cenários de utilização de tipos genéricos para que você possa fazer uso desse recurso da linguagem com mais eficiência. Muito obrigado e até a próxima aula. [MÚSICA] [MÚSICA]