2
respostas

Generics, Qual a vantagem de utilizar

Boa tarde, após ver várias aulas do curso ainda estou com dúvidas sobre Generics, Qual a vantagem de utilizar? Qual a desvantagem? Quando utilizar? Algum material que possam recomendar para leitura?

Boa tarde!

Rodrigo

2 respostas

Olá, Rodrigo.

Generics é uma feature sensacional e te ajuda quando você quer trabalhar com tipos "dinâmicos" em linguagem de tipagem estática.

Acho que o exemplo mais claro que eu vejo é de DAOs (Data Access Object). Imagina que você vai ter classes que fazem acesso aos dados do seu sistema. Independente de ser Cliente, Produto, Aluno ou qualquer outra classe a buscar, você precisa: Inserir, Ler, Atualizar e Remover. Você pode então criar uma interface para essas classes que vão manipular os dados. Mas, o método inserir recebe que tipo por parâmetro? E o que o ler retorna? Com generics isso fica fácil.

interface Dao<T> {
    public T buscarTodos();
    public void inserir(T dado);
}

class ClienteDao implements Dao<Cliente> {
    public Cliente buscarTodos() { ... }
    public void inserir(Cliente dado) { ... }
}

Não sou desenvolvedor Java, então talvez alguém chegue com uma resposta um pouco mais completa, mas basicamente é isso.

Boa tarde Rodrigo,

Uma das vantagens no meu ponto de vista é reaproveitar código, vou te dar um exemplo de como uso.

Em meu projetos eu crio sempre uma interface com o nome ServiceCrud:

**

public interface ServiceCrud <T,I> {

public void save(T save);

public void delete(T delete);

public List<T> listarTudo();

public T pegarPorId(G id);

}

vamos supor que eu tenha uma classe Pessoa e uma serviço que traz as informações do banco, no meu PessoaService eu implemento essa interface algo assim:

public class PessoaService implements ServiceCrud<T,G>{...}

no caso do T eu passo o Objeto pessoa, e no G eu passo o ID da minha classe (entidade), então tenho sou obrigado a implementar os métodos que defini em minha interface ficaria:

**

public class PessoaService implements ServiceCrud<Pessoa, Long>{

@Override
public void save(Pessoa save){

}

@Override
public void delete(Pessoa delete){

}

@Override
public List<Pessoa> listarTudo(){
  return pessoaList;
}

@Override
public T pegarPorId(Long id);
  return pessoaPorId(id);
}

perceba que o "T" foi substituído pelo meu objeto (entidade) "Pessoa" e o "G" pelo tipo do ID um long, se tiver 100 serviços no meu projeto, eu não corro o risco de esquecer de implementar um desses métodos, e diminui um pouco a reescrita, espero que tenha conseguido te dar uma ideia, esse é o jeito que mais uso generics