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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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