Generiske klasser forenkler gjenbruk. Gjør koden din skalerbar og effektiv ved å bruke generiske klasser i Java.

Generics er et programmeringskonsept som lar deg spesifisere typen du har tenkt å lagre i en samling. En generisk type kan være en hvilken som helst ikke-primitiv verdi. De tradisjonelle typeparametrene du kanskje er kjent med er streng og heltall.

Du kan imidlertid lage en unik generisk type. Videre kan du opprette en generisk klasse og bruke den til å lage forskjellige samlinger ved hjelp av generiske artikler.

Opprette en generisk type

En generisk type er i hovedsak et objekt, opprettet ved hjelp av en klasse eller et grensesnitt. Så for denne artikkelen vil den generiske typen være en kunde. Ved å bruke en eksempelapplikasjon på bedriftsnivå, representerer kunden en enhet i et databasesystem. Dette databasesystemet betjener et møbelfirma som har tre fysiske lokasjoner i tre forskjellige byer.

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

Du vil legge merke til abstrakt nøkkelord i Kunde klasseerklæring ovenfor. Det betyr at du ikke kan lage en direkte type eller objekt fra Kunde type.

Gitt at hvert fysisk butikksted vil ha en unik liste over kunder, må applikasjonen ha tre kundeunderklasser som du vil implementere ved å bruke konseptet for arveprogrammering.

Disse tre underklassene vil være de solide typene til den generiske Kunde type. Den første Kunde underklassen vil inneholde følgende kode:

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

Opprette en generisk klasse

For å bruke en generisk type, må du ha en generisk klasse eller metode som godtar denne typen som en parameter. For å lage en generisk klasse trenger du bare å sette inn typeparameteren i klassedeklarasjonen.

publicclassPromotion<T> {}

Koden ovenfor indikerer at Forfremmelse klasse er generisk. Dette betyr at Forfremmelse klasse bruker typer for å lage sine objekter. Nå kan klasseerklæringen ta en samling av objekter som er strenger, heltall, kunder og så videre. Møbelbedriften ønsker imidlertid kun den Forfremmelse klasse for å lage objekter ved hjelp av Kunde typer.

publicclassPromotion<TextendsCustomer> {}

Den oppdaterte koden ovenfor sikrer at Forfremmelse klasse tar bare Kunde typer, betyr dette alle underklasser av Kunde klasse.

Gitt at det er tre butikker, ønsker selskapet å lage en uavhengig kampanje for hver butikk. Dataene som kreves for disse kampanjene er like. Hver kampanje vil ha et navn og en samling kunder som vant i den kampanjen.

Det er flere måter å nærme seg dette problemet på. Du kan lage en Forfremmelse overordnet klasse og har tre underklasser for hvert butikksted. Men siden hver Forfremmelse har en lignende struktur, vil du ende opp med å skrive duplikatkode, noe som er ineffektivt (spesielt siden du allerede jobber med Kunde underklasser).

Derfor, a Forfremmelse generisk klasse er en av de mer effektive løsningene på dette problemet.

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 Forfremmelse generisk klasse har en enkelt variabel (promonavn). Denne Java-klassen godtar en samling av kunder som vant kampanjen (vinnere) og lagrer dem i en ArrayList datastruktur. For å legge til en ny kunde i en spesifikk kampanjesamling, må du bruke addCustomer() metode. Hvis du på noe tidspunkt ønsker å vite antall kunder som er i en samling, kan du påkalle antall Vinnere() metode.

Opprette samlinger ved hjelp av en generisk klasse

Før du kan begynne å lage samlinger, må du opprette 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 Hoved klasse ovenfor oppretter fire kundeobjekter, som hver tilhører en av de tre butikklokasjonene. For å begynne å lage samlinger må du først opprette kampanjeobjekter (ett for hvert butikksted).

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

Sette inn de tre kodelinjene ovenfor i Hoved klasse vil effektivt opprette tre typespesifikke (eller stedsspesifikke) kampanjer. Så, bare kunder fra butikken i den første byposisjonen (City1 Kunde) kan bli en vinner i den byens kampanje (city1promo).

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

Legg derfor koden ovenfor til Hoved klasse vil produsere følgende resultat i konsollen:

Men hvis du prøver å legge til en tredje kunde til kampanjevinnerlisten i den første byen, vil IDE-en din produsere en kompileringsfeil.

Dette er fordi verken Jane eller Jess er kunde i butikken i den første byen. Det er nyttig å lage generiske typer og klasser, siden det forhindrer at disse enkle feilene ikke blir fanget opp og ødelegger systemets database. I en liten applikasjon kan det være lett å oppdage feil som dette, men i et system på bedriftsnivå kan feil som dette forbli uoppdaget.

city2promo.addCustomer(jane);

Hvis du erstatter den feilaktige kodelinjen med den ovenfor, skrives følgende ut til konsollen:

Fordeler med å bruke de generiske typene

Fra eksempelapplikasjonen i denne artikkelen kan du se at en stor fordel med å bruke generiske typer er kompileringstidstypekontroll. Uten typekontroll ville ikke det å legge til Jane på noen av de tre kampanjelistene gi en utførelsestidsfeil, siden Jane faktisk er kunde av møbelfirmaet.

Generikk legger også til rette for flere andre fordeler, inkludert kodegjenbrukbarhet og skalerbarhet. Etter hvert som selskapet ekspanderer til nye byer, kan du enkelt opprette nye kampanjeobjekttyper ved å stole sterkt på den eksisterende koden. Generiske typer lar deg også lage effektiv kode, som er en toppprioritet i programvareutviklingsprosessen.