As classes genéricas facilitam a reutilização. Torne seu código escalável e eficiente usando classes genéricas em Java.

Generics é um conceito de programação que permite especificar o tipo que você pretende armazenar em uma coleção. Um tipo genérico pode ser qualquer valor não primitivo. Os parâmetros de tipo tradicionais com os quais você pode estar familiarizado são string e integer.

No entanto, você pode criar um tipo genérico exclusivo. Além disso, você pode criar uma classe genérica e usá-la para criar diferentes coleções usando genéricos.

Criando um tipo genérico

Um tipo genérico é essencialmente um objeto, criado usando uma classe ou uma interface. Portanto, para este artigo, o tipo genérico será um cliente. Usando um aplicativo de nível corporativo de amostra, o cliente representa uma entidade em um sistema de banco de dados. Este sistema de banco de dados atende a uma empresa de móveis que possui três locais físicos em três cidades diferentes.

publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}

Você notará o abstrato palavra-chave no Cliente declaração de classe acima. Isso significa que você não pode criar um tipo ou objeto direto do Cliente tipo.

Dado que cada local de loja física terá uma lista exclusiva de clientes, o aplicativo precisará ter três subclasses de clientes que você implementará usando o conceito de programação de herança.

Essas três subclasses serão os tipos sólidos para o genérico Cliente tipo. O primeiro Cliente subclasse conterá o seguinte código:

publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}

Criando uma Classe Genérica

Para usar um tipo genérico, você precisará ter uma classe ou método genérico que aceite esse tipo como parâmetro. Para criar uma classe genérica, basta inserir o parâmetro de tipo na declaração da classe.

publicclassPromotion<T> {}

O código acima indica que o Promoção classe é genérica. Isso significa que o Promoção classe usa tipos para criar seus objetos. Agora a declaração de classe pode receber uma coleção de objetos que são strings, inteiros, clientes e assim por diante. No entanto, a empresa de móveis quer apenas o Promoção classe para criar objetos usando o Cliente tipos.

publicclassPromotion<TextendsCustomer> {}

O código atualizado acima garante que o Promoção classe leva apenas o Cliente tipos, isso significa todas as subclasses do Cliente aula.

Dado que existem três lojas, a empresa deseja criar uma promoção independente para cada loja. Os dados necessários para essas promoções são semelhantes. Cada promoção terá um nome e uma coleção de clientes que ganharam naquela promoção.

Existem várias maneiras de abordar esse problema. Você poderia criar um Promoção classe pai e tem três subclasses para cada local de armazenamento. Mas já que cada um Promoção tem uma estrutura semelhante, você acabará escrevendo código duplicado, o que é ineficiente (principalmente porque você já está trabalhando com Cliente subclasses).

Portanto, um Promoção classe genérica é uma das soluções mais eficientes para este problema.

import java.util.ArrayList;

publicclassPromotion<TextendsCustomer> {

private String promoName;
private ArrayList winners = new ArrayList<>();

publicPromotion(String promoName){
this.promoName = promoName;
}

public String getPromoName(){
return promoName;
}

publicvoidaddCustomer(T customer){
if (winners.contains(customer)) {
System.out.println( customer.getName() + " is already a winner of this prize.");
} else {
winners.add(customer);
System.out.println( customer.getName() + " is a winner in the " + this.promoName);
}
}

publicintnumWinners(){
returnthis.winners.size();
}
}

O Promoção classe genérica tem uma única variável (promoNome). Essa classe Java aceita uma coleção de clientes que ganharam a promoção (vencedores) e os armazena em um Estrutura de dados ArrayList. Para adicionar um novo cliente a uma coleção de promoção específica, você precisaria usar o addCliente() método. Se em algum momento você quiser saber o número de clientes que estão em uma coleção, você pode invocar o numWinners() método.

Criando coleções usando uma classe genérica

Antes de começar a criar coleções, você precisará criar clientes.

publicclassMain{
publicstaticvoidmain(String[] args){
City1Customer john = new City1Customer("John Brown");
City1Customer kelly = new City1Customer("Kelly James");
City2Customer jane = new City2Customer("Jane Doe");
City3Customer jess = new City3Customer("Jess Smith");
}
}

O Principal A classe acima cria quatro objetos de cliente, cada um pertencente a um dos três locais de armazenamento. Para começar a criar coleções você precisará primeiro criar objetos de promoção (um para cada loja).

Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");

Inserindo as três linhas de código acima no Principal class criará efetivamente três promoções específicas do tipo (ou específicas do local). Assim, somente os clientes da loja localizada na primeira localidade da cidade (Cidade1Cliente) pode ser um vencedor na promoção dessa cidade (city1promo).

city1promo.addCustomer(john);
city1promo.addCustomer(kelly);

Portanto, adicionando o código acima ao Principal class produzirá o seguinte resultado no console:

No entanto, se você tentar adicionar um terceiro cliente à lista de vencedores da promoção na primeira cidade, seu IDE produzirá um erro de compilação.

Isto porque nem Jane nem Jess é cliente da loja da primeira cidade. A criação de tipos e classes genéricos é útil, pois evita que esses erros simples não sejam detectados e corrompam o banco de dados de um sistema. Em um aplicativo pequeno, pode ser fácil detectar erros como esse, mas em um sistema de nível empresarial, erros como esse podem passar despercebidos.

city2promo.addCustomer(jane);

Substituir a linha de código errada pela linha acima imprimirá a seguinte saída no console:

Benefícios de usar os tipos genéricos

No aplicativo de amostra deste artigo, você pode ver que uma grande vantagem de usar tipos genéricos é a verificação de tipo em tempo de compilação. Sem a verificação de tipo, adicionar Jane a qualquer uma das três listas de promoção não produziria um erro de tempo de execução, pois Jane é de fato uma cliente da empresa de móveis.

Os genéricos também facilitam várias outras vantagens, incluindo reusabilidade e escalabilidade de código. À medida que a empresa se expande para novas cidades, você pode criar facilmente novos tipos de objetos de promoção, contando fortemente com o código existente. Os tipos genéricos também permitem criar código eficiente, que é uma prioridade no processo de desenvolvimento de software.