Generiska klasser underlättar återanvändning. Gör din kod skalbar och effektiv med hjälp av generiska klasser i Java.

Generics är ett programmeringskoncept som låter dig specificera vilken typ du tänker lagra i en samling. En generisk typ kan vara vilket icke-primitivt värde som helst. De traditionella typparametrarna som du kanske känner till är sträng och heltal.

Du kan dock skapa en unik generisk typ. Dessutom kan du skapa en generisk klass och använda den för att skapa olika samlingar med generika.

Skapa en generisk typ

En generisk typ är i huvudsak ett objekt, skapad med en klass eller ett gränssnitt. Så för den här artikeln kommer den generiska typen att vara en kund. Med hjälp av en exempelapplikation på företagsnivå representerar kunden en enhet i ett databassystem. Detta databassystem betjänar ett möbelföretag som har tre fysiska platser i tre olika städer.

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

Du kommer att märka abstrakt nyckelord i Kund klassdeklaration ovan. Det betyder att du inte kan skapa en direkt typ eller objekt från Kund typ.

Med tanke på att varje fysisk butiksplats kommer att ha en unik lista över kunder, kommer applikationen att behöva ha tre kundunderklasser som du kommer att implementera med begreppet arvsprogrammering.

Dessa tre underklasser kommer att vara de solida typerna till de generiska Kund typ. Den första Kund underklass kommer att innehålla följande kod:

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

Skapa en generisk klass

För att använda en generisk typ måste du ha en generisk klass eller metod som accepterar denna typ som en parameter. För att skapa en generisk klass behöver du bara infoga typparametern i klassdeklarationen.

publicclassPromotion<T> {}

Koden ovan indikerar att Befordran klass är generisk. Detta innebär att Befordran class använder typer för att skapa sina objekt. Nu kan klassdeklarationen ta en samling objekt som är strängar, heltal, kunder och så vidare. Möbelföretaget vill dock bara ha Befordran klass för att skapa objekt med hjälp av Kund typer.

publicclassPromotion<TextendsCustomer> {}

Den uppdaterade koden ovan säkerställer att Befordran klass tar bara Kund typer, betyder detta alla underklasser av Kund klass.

Med tanke på att det finns tre butiker vill företaget skapa en oberoende kampanj för varje butik. De uppgifter som krävs för dessa kampanjer är liknande. Varje kampanj kommer att ha ett namn och en samling kunder som vann i kampanjen.

Det finns flera sätt att närma sig detta problem. Du kan skapa en Befordran moderklass och har tre underklasser för varje butiksplats. Men eftersom varje Befordran har en liknande struktur kommer du att skriva duplicerad kod, vilket är ineffektivt (särskilt eftersom du redan arbetar med Kund underklasser).

Därför, a Befordran generisk klass är en av de mer effektiva lösningarna på detta 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();
}
}

De Befordran generisk klass har en enda variabel (promoName). Denna Java-klass accepterar en samling kunder som vann kampanjen (vinnare) och lagrar dem i en ArrayList-datastruktur. För att lägga till en ny kund till en specifik kampanjsamling, måste du använda addCustomer() metod. Om du vid något tillfälle vill veta antalet kunder som finns i en samling kan du åberopa antal Vinnare() metod.

Skapa samlingar med en allmän klass

Innan du kan börja skapa samlingar måste du skapa 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");
}
}

De Main klass ovan skapar fyra kundobjekt som vart och ett tillhör en av de tre butiksplatserna. För att börja skapa samlingar måste du först skapa kampanjobjekt (ett för varje butiksplats).

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

Infoga de tre kodraderna ovan i Main klass kommer i praktiken att skapa tre typspecifika (eller platsspecifika) kampanjer. Så, endast kunder från butiken i den första staden (City1Kund) kan bli en vinnare i den stadens marknadsföring (city1promo).

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

Lägg därför till ovanstående kod till Main klass kommer att producera följande resultat i konsolen:

Men om du försöker lägga till en tredje kund till kampanjvinnarlistan i den första staden, skulle din IDE skapa ett kompileringsfel.

Detta beror på att varken Jane inte heller Jess är kund till butiken i första staden. Att skapa generiska typer och klasser är användbart, eftersom det förhindrar att dessa enkla fel förblir oupptäckta och korrumperar ett systems databas. I en liten applikation kan det vara lätt att upptäcka sådana här fel, men i ett system på företagsnivå kan sådana här fel förbli oupptäckta.

city2promo.addCustomer(jane);

Om du ersätter den felaktiga kodraden med den ovanstående kommer följande utdata att skrivas ut till konsolen:

Fördelar med att använda de generiska typerna

Från exempelapplikationen i den här artikeln kan du se att en stor fördel med att använda generiska typer är typkontroll vid kompilering. Utan typkontroll skulle inte lägga till Jane i någon av de tre kampanjlistorna leda till ett exekveringsfel, eftersom Jane verkligen är kund till möbelföretaget.

Generics underlättar också flera andra fördelar, inklusive kodåteranvändbarhet och skalbarhet. När företaget expanderar till nya städer kan du enkelt skapa nya kampanjobjekttyper, mycket beroende av den befintliga koden. Generiska typer låter dig också skapa effektiv kod, vilket är en högsta prioritet i mjukvaruutvecklingsprocessen.