Generičke klase olakšavaju ponovnu upotrebu. Neka vaš kod bude skalabilan i učinkovit pomoću generičkih klasa u Javi.

Generički je koncept programiranja koji vam omogućuje da odredite vrstu koju namjeravate pohraniti u zbirku. Generički tip može biti bilo koja ne-primitivna vrijednost. Parametri tradicionalnog tipa s kojima ste možda upoznati su niz i cijeli broj.

Međutim, možete stvoriti jedinstveni generički tip. Nadalje, možete stvoriti generičku klasu i koristiti je za stvaranje različitih kolekcija pomoću generičkih.

Stvaranje generičkog tipa

Generički tip je u biti objekt, stvoren pomoću klase ili sučelje. Dakle, za ovaj članak, generički tip će biti kupac. Koristeći primjer aplikacije na razini poduzeća, korisnik predstavlja entitet u sustavu baze podataka. Ovaj sustav baze podataka pruža usluge tvrtki za namještaj koja ima tri fizičke lokacije u tri različita grada.

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

Primijetit ćete sažetak ključna riječ u Kupac gornja deklaracija klase. To znači da ne možete stvoriti izravni tip ili objekt iz Kupac tip.

S obzirom da će svaka lokacija fizičke trgovine imati jedinstveni popis kupaca, aplikacija će morati imati tri podklase kupaca koje ćete implementirati pomoću koncept programiranja nasljeđivanja.

Ove tri potklase bit će čvrsti tipovi prema generičkom Kupac tip. Prvi Kupac podklasa će sadržavati sljedeći kod:

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

Stvaranje generičke klase

Da biste koristili generički tip, morat ćete imati generičku klasu ili metodu koja prihvaća ovaj tip kao parametar. Da biste stvorili generičku klasu, jednostavno trebate umetnuti parametar tipa u deklaraciju klase.

publicclassPromotion<T> {}

Gornji kod označava da je Promocija klasa je generička. To znači da je Promocija klasa koristi tipove za stvaranje svojih objekata. Sada deklaracija klase može uzeti kolekciju objekata koji su nizovi, cijeli brojevi, kupci itd. Međutim, tvrtka za namještaj želi samo Promocija klase za stvaranje objekata pomoću Kupac vrste.

publicclassPromotion<TextendsCustomer> {}

Gornji ažurirani kod osigurava da Promocija klasa uzima samo Kupac vrste, to znači sve podklase od Kupac razreda.

S obzirom da postoje tri trgovine, tvrtka želi napraviti jednu neovisnu promociju za svaku trgovinu. Podaci potrebni za ove promocije su slični. Svaka promocija će imati ime i kolekciju kupaca koji su pobijedili u toj promociji.

Postoji nekoliko načina za pristup ovom problemu. Mogli biste stvoriti a Promocija nadređenu klasu i imaju tri podklase za svaku lokaciju trgovine. Ali budući da svaki Promocija ima sličnu strukturu, na kraju ćete napisati dvostruki kod, što je neučinkovito (pogotovo jer već radite s Kupac podrazreda).

Stoga, a Promocija generička klasa jedno je od učinkovitijih rješenja za ovaj 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();
}
}

The Promocija generička klasa ima jednu varijablu (promoName). Ova Java klasa prihvaća zbirku kupaca koji su osvojili promociju (pobjednici) i pohranjuje ih u Struktura podataka ArrayList. Da biste dodali novog kupca u određenu promotivnu kolekciju, trebate koristiti addCustomer() metoda. Ako u bilo kojem trenutku želite znati broj kupaca koji su u zbirci, možete pozvati numWinners() metoda.

Stvaranje kolekcija korištenjem generičke klase

Prije nego počnete stvarati zbirke, morat ćete stvoriti kupce.

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

The Glavni gornja klasa stvara četiri objekta kupca, od kojih svaki pripada jednoj od tri lokacije trgovine. Da biste započeli s izradom zbirki, morat ćete prvo izraditi promotivne objekte (po jedan za svaku lokaciju trgovine).

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

Umetanje tri retka koda iznad u Glavni klasa će učinkovito stvoriti tri promocije specifične za vrstu (ili lokaciju). Dakle, samo kupci iz trgovine na prvoj gradskoj lokaciji (City1Customer) može biti pobjednik u promociji tog grada (city1promo).

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

Stoga, dodavanje gornjeg koda u Glavni klasa će proizvesti sljedeći rezultat u konzoli:

Međutim, ako pokušate dodati trećeg kupca na popis dobitnika promocije u prvom gradu, vaš IDE će proizvesti pogrešku kompilacije.

To je zato što ni jedno ni drugo Jane ni Jess je kupac trgovine u prvom gradu. Stvaranje generičkih tipova i klasa je korisno jer sprječava da te jednostavne pogreške ostanu neuhvaćene i oštete bazu podataka sustava. U maloj aplikaciji može biti lako uočiti greške poput ove, ali u sustavu na razini poduzeća takve pogreške mogu ostati neuhvaćene.

city2promo.addCustomer(jane);

Zamjena pogrešnog retka koda onim iznad ispisat će sljedeći izlaz na konzolu:

Prednosti korištenja generičkih tipova

Iz uzorka aplikacije u ovom članku možete vidjeti da je glavna prednost korištenja generičkih tipova provjera tipa tijekom kompilacije. Bez provjere tipa, dodavanje Jane na bilo koji od tri promotivna popisa ne bi proizvelo pogrešku vremena izvršenja, budući da je Jane doista klijent tvrtke namještaja.

Generici također olakšavaju nekoliko drugih prednosti uključujući ponovnu upotrebu koda i skalabilnost. Kako se tvrtka širi na nove gradove, možete jednostavno kreirati nove vrste promotivnih objekata, uvelike se oslanjajući na postojeći kod. Generički tipovi također vam omogućuju stvaranje učinkovitog koda, što je glavni prioritet u procesu razvoja softvera.