Em um projeto de software utilizamos, em média, apenas 20% do tempo em desenvolvimento, e os outros 80%, em manutenção. A ocorrência de erros é um dos principais motivos para a alteração de código, e, em alguns casos, até a sua reescrita. Nesse contexto, é importante a adoção de boas práticas de programação para a escrita de códigos legíveis e de fácil alteração, pois a ocorrência de bugs diminui na medida em que as aplicamos.
Para ajudar o desenvolvedor na adoção destas práticas, foi introduzido Generics na versão 5 da plataforma Java. Um recurso adicionado para fazer a verificação, em tempo de compilação, de tipos manipulados por uma classe. Como exemplo, podemos citar as classes da Collections API voltadas ao uso de conjuntos (List, Set e Map). Um dos motivos para a inclusão de Generics é a garantia de que pelo menos um tipo de objeto será relacionado a estas classes, deixando claro para o profissional com quais elementos ele está trabalhando em uma coleção. Por exemplo, podemos ter um objeto List gerenciando outros Double e outra coleção responsável por objetos Calendar. Ao programar desta maneira, evitamos o uso de uma única lista para ambos, tornando o código mais claro para o desenvolvedor.
Outro objetivo da inclusão de Generics é a redução de bugs em tempo de execução. Com ele, é possível a captura de erros na compilação, alertando o desenvolvedor sobre a ocorrência de exceções comuns, como uma ClassCastException. Consequentemente, fornece um meio para a escrita de um código mais seguro.
A reusabilidade também faz parte do recurso. Utilizando novamente uma classe da API de Collections como exemplo, podemos criar listas de String, outras de Integer e outras para qualquer classe. Desta forma, evitamos a escrita de código repetido e desnecessário.
Nesse cenário, o objetivo deste artigo é a apresentação de Generics ao desenvolvedor, listando todos os benefícios de sua utilização. Por meio de exemplos, os problemas que podem ser causados pelo não uso deste são apontados ao leitor. E no segundo artigo da minissérie, os mesmos exemplos serão apresentados, mas aplicando o novo conceito e explicitando porque este é a solução para as falhas decorrentes.
Desenvolvimento antes de Generics
Para demonstrar como é realizada a codificação sem o uso de Generics, vamos imaginar o seguinte cenário: precisamos criar uma lista para o armazenamento de objetos de um determinado tipo. Para esta finalidade, vamos trabalhar com o exemplo a seguir: em um estacionamento, há vagas para vários tipos de veículo, como Carros, Motocicletas e Ônibus. A representação destes modelos está no diagrama de classes da Figura 1.
As implementações destas classes, que originarão os objetos a serem armazenados no estabelecimento, encontram-se nas Listagens 1, 2, 3 e 4.
package br.com.devmedia.javamagazine.generics.estacionamento.veiculos;
public abstract class Veiculo {
protected String nome;
protected String marca;
protected String cor;
public Veiculo(String nome, String marca, String cor) {
this.nome = nome;
this.marca = marca;
this.cor = cor;
}
public abstract String listarDados();
// métodos representando funcionalidades de um veículo
// como ligar, desligar, acelera e frear
// setters e getters omitidos
}
package br.com.devmedia.javamagazine.generics.estacionamento.veiculos;
public class Carro extends Veiculo {
public Carro(String nome, String marca, String cor) {
super(nome, marca, cor);
}
@Override
public void listarDados() {
return "Nome do carro: " + nome + "\nMarca: " + marca + "\nCor: " + cor;
}
// métodos representando funcionalidades de um veículo
// como ligar, desligar, acelerar e frear
// setters e getters omitidos
}
package br.com.devmedia.javamagazine.generics.estacionamento.veiculos;
public class Motocicleta extends Veiculo {
public Motocicleta(String nome, String marca, String cor) {
super(nome, marca, cor);
}
@Override
public String listarDados() {
return "Nome da motocicleta: " + nome + "\nMarca: " + marca + "\nCor: " + cor;
}
// métodos representando funcionalidades de um veículo
// como ligar, desligar, acelerar e frear
// setters e getters omitidos
}
package br.com.devmedia.javamagazine.generics.estacionamento.veiculos;
public class Onibus extends Veiculo {
public Onibus(String nome, String marca, String cor) {
super(nome, marca, cor);
}
@Override
public String listarDados() {
return "Nome do onibus: " + nome + "\nMarca: " + marca + "\nCor: " + cor;
}
// métodos representando funcionalidades de um veículo
// como ligar, desligar, acelerar e frear
// setters e getters omitidos
}
A Listagem 1 apresenta o código de uma classe abstrata para um veículo com os seus métodos e atributos representando aspectos do mundo real, como acelerar(), frear() e cor, respectivamente. Já as Listagens 2, 3 e 4 são referentes aos tipos específicos de automóveis que podem ser armazenados no estacionamento. Para a demonstração do artigo, apenas três tipos de veículo foram criados: Carro, Motocicleta e Onibus. Para facilitar a compreensão de Generics, métodos comuns a um veículo, como ligar() e acelerar(), não estão presentes nas listagens.
Para a representação do estacionamento e respectivo controle e gerenciamento dos veículos cadastrados, codificamos a Listagem 5. Métodos para adicionar novos veículos no local (adicionar()) e para a listagem dos mesmos (listarVeiculos()) estão nesta classe para mostrar suas principais funcionalidades e características. O atributo veiculos, declarado como um objeto do tipo List, refere-se aos veículos a serem armazenados no local.
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.