Generiske klasser letter genanvendelighed. Gør din kode skalerbar og effektiv ved hjælp af generiske klasser i Java.

Generics er et programmeringskoncept, der giver dig mulighed for at specificere den type, du har til hensigt at gemme i en samling. En generisk type kan være enhver ikke-primitiv værdi. De traditionelle typeparametre, som du måske er bekendt med, er streng og heltal.

Du kan dog oprette en unik generisk type. Desuden kan du oprette en generisk klasse og bruge den til at oprette forskellige samlinger ved hjælp af generiske stoffer.

Oprettelse af en generisk type

En generisk type er i bund og grund et objekt, oprettet ved hjælp af en klasse eller en grænseflade. Så for denne artikel vil den generiske type være en kunde. Ved at bruge en prøveapplikation på virksomhedsniveau repræsenterer kunden en enhed i et databasesystem. Dette databasesystem servicerer et møbelfirma, der har tre fysiske lokationer i tre forskellige byer.

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

Du vil bemærke abstrakt søgeord i Kunde klasseerklæring ovenfor. Det betyder, at du ikke kan oprette en direkte type eller objekt fra Kunde type.

Da hver fysisk butiksplacering vil have en unik liste over kunder, skal applikationen have tre kundeunderklasser, som du vil implementere ved hjælp af arveprogrammeringskonceptet.

Disse tre underklasser vil være de solide typer til de generiske Kunde type. Den første Kunde underklasse vil indeholde følgende kode:

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

Oprettelse af en generisk klasse

For at bruge en generisk type skal du have en generisk klasse eller metode, der accepterer denne type som en parameter. For at oprette en generisk klasse skal du blot indsætte typeparameteren i klassedeklarationen.

publicclassPromotion<T> {}

Koden ovenfor angiver, at Forfremmelse klasse er generisk. Det betyder, at Forfremmelse klasse bruger typer til at skabe sine objekter. Nu kan klasseerklæringen tage en samling af objekter, der er strenge, heltal, kunder og så videre. Møbelfirmaet ønsker dog kun den Forfremmelse klasse for at oprette objekter ved hjælp af Kunde typer.

publicclassPromotion<TextendsCustomer> {}

Den opdaterede kode ovenfor sikrer, at Forfremmelse klasse tager kun Kunde typer, betyder dette alle underklasser af Kunde klasse.

Da der er tre butikker, ønsker virksomheden at skabe én uafhængig kampagne for hver butik. De nødvendige data til disse kampagner er ens. Hver kampagne vil have et navn og en samling af kunder, der vandt i denne kampagne.

Der er flere måder at gribe dette problem an på. Du kan oprette en Forfremmelse overordnet klasse og har tre underklasser for hver butiksplacering. Men siden hver Forfremmelse har en lignende struktur, vil du ende med at skrive dubletkode, hvilket er ineffektivt (især da du allerede arbejder med Kunde underklasser).

Derfor, en Forfremmelse generisk klasse er en af ​​de mere effektive løsninger på dette problem.

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();
}
}

Det Forfremmelse generisk klasse har en enkelt variabel (promonavn). Denne Java-klasse accepterer en samling af kunder, der vandt kampagnen (vindere) og gemmer dem i en ArrayList datastruktur. For at tilføje en ny kunde til en specifik kampagnesamling, skal du bruge addCustomer() metode. Hvis du på noget tidspunkt ønsker at vide antallet af kunder, der er i en samling, kan du påberåbe dig antal Vindere() metode.

Oprettelse af samlinger ved hjælp af en generisk klasse

Før du kan begynde at oprette samlinger, skal du oprette kunder.

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");
}
}

Det Hoved klasse ovenfor opretter fire kundeobjekter, der hver tilhører en af ​​de tre butikslokationer. For at begynde at oprette samlinger skal du først oprette salgsfremmende objekter (én for hver butiksplacering).

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

Indsættelse af de tre linjer kode ovenfor i Hoved klasse vil effektivt oprette tre typespecifikke (eller stedspecifikke) kampagner. Så kun kunder fra butikken i den første byplacering (City1 Kunde) kan blive en vinder i den bys promovering (city1promo).

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

Derfor tilføjer du ovenstående kode til Hoved klasse vil producere følgende resultat i konsollen:

Men hvis du forsøger at tilføje en tredje kunde til kampagnevinderlisten i den første by, vil din IDE producere en kompileringsfejl.

Dette er fordi hverken Jane heller ikke Jess er kunde i butikken i den første by. Det er nyttigt at oprette generiske typer og klasser, da det forhindrer disse simple fejl i at blive ufanget og ødelægge et systems database. I en lille applikation kan det være let at opdage fejl som denne, men i et system på virksomhedsniveau kan fejl som denne forsvinde.

city2promo.addCustomer(jane);

Udskiftning af den fejlagtige kodelinje med den ovenstående vil udskrive følgende output til konsollen:

Fordele ved at bruge de generiske typer

Fra eksempelapplikationen i denne artikel kan du se, at en stor fordel ved at bruge generiske typer er kontrol af kompileringstid. Uden typekontrol ville tilføjelse af Jane til nogen af ​​de tre kampagnelister ikke give en fejl i udførelsestidspunktet, da Jane faktisk er kunde hos møbelfirmaet.

Generics letter også flere andre fordele, herunder kodegenanvendelighed og skalerbarhed. Efterhånden som virksomheden udvider til nye byer, kan du nemt oprette nye reklameobjekttyper, der er stærkt afhængige af den eksisterende kode. Generiske typer giver dig også mulighed for at skabe effektiv kode, hvilket er en topprioritet i softwareudviklingsprocessen.