Üldklassid hõlbustavad korduvkasutamist. Muutke oma kood skaleeritavaks ja tõhusaks, kasutades Java üldklasse.

Generics on programmeerimiskontseptsioon, mis võimaldab teil määrata tüübi, mida kavatsete kogusse salvestada. Üldine tüüp võib olla mis tahes mitteprimitiivne väärtus. Traditsioonilised tüübiparameetrid, mis võivad teile tuttavad olla, on string ja täisarv.

Siiski saate luua ainulaadse üldise tüübi. Lisaks saate luua üldise klassi ja kasutada seda erinevate kogude loomiseks, kasutades üldisi.

Üldise tüübi loomine

Üldine tüüp on sisuliselt objekt, loodud klassi abil või liides. Seega on selle artikli üldiseks tüübiks klient. Ettevõttetaseme näidisrakendust kasutades esindab klient andmebaasisüsteemis olemit. See andmebaasisüsteem teenindab mööbliettevõtet, millel on kolm füüsilist asukohta kolmes erinevas linnas.

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

Te märkate, abstraktne märksõna Klient

klassi deklaratsioon eespool. See tähendab, et te ei saa luua otsest tüüpi ega objekti Klient tüüp.

Arvestades, et igal füüsilisel poe asukohal on kordumatu klientide loend, peab rakendusel olema kolm klientide alamklassi, mida rakendate pärandi programmeerimise kontseptsioon.

Need kolm alamklassi on üldise klassi tahked tüübid Klient tüüp. Esimene Klient alamklass sisaldab järgmist koodi:

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

Üldklassi loomine

Üldise tüübi kasutamiseks peab teil olema üldine klass või meetod, mis aktsepteerib seda tüüpi parameetrina. Üldise klassi loomiseks peate lihtsalt sisestama tüübi parameetri klassi deklaratsiooni.

publicclassPromotion<T> {}

Ülaltoodud kood näitab, et Edendamine klass on üldine. See tähendab, et Edendamine klass kasutab oma objektide loomiseks tüüpe. Nüüd võib klassideklaratsioon võtta objektide kogumi, mis on stringid, täisarvud, kliendid ja nii edasi. Mööblifirma soovib aga ainult Edendamine klassis, et luua objekte kasutades Klient tüübid.

publicclassPromotion<TextendsCustomer> {}

Ülaltoodud värskendatud kood tagab, et Edendamine klass võtab ainult Klient tüüpi, tähendab see kõiki alamklasse Klient klass.

Arvestades, et kauplusi on kolm, soovib ettevõte luua igale poele ühe sõltumatu kampaania. Nende reklaamide jaoks vajalikud andmed on sarnased. Igal pakkumisel on nimi ja selle pakkumise võitnud klientide kogum.

Sellele probleemile lähenemiseks on mitu võimalust. Võite luua a Edendamine vanemklass ja neil on iga kaupluse asukoha jaoks kolm alamklassi. Aga kuna iga Edendamine millel on sarnane struktuur, kirjutate lõpuks duplikaatkoodi, mis on ebaefektiivne (eriti kuna te juba töötate Klient alamklassid).

Seetõttu a Edendamine geneeriline klass on üks tõhusamaid lahendusi sellele probleemile.

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 Edendamine üldklassil on üks muutuja (promoName). See Java-klass võtab vastu kampaania võitnud klientide kogu (võitjad) ja salvestab need kataloogi ArrayListi andmestruktuur. Uue kliendi lisamiseks konkreetsesse reklaamikogusse peate kasutama addCustomer() meetod. Kui soovite mingil hetkel teada kogus olevate klientide arvu, saate kasutada võitjate arv() meetod.

Kogude loomine üldise klassi abil

Enne kogude loomise alustamist peate looma kliendid.

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 Peamine klass ülal loob neli kliendiobjekti, millest igaüks kuulub ühte kolmest kaupluse asukohast. Kollektsioonide loomise alustamiseks peate esmalt looma reklaamiobjektid (üks iga poe asukoha kohta).

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

Ülaltoodud kolme koodirea sisestamine lahtrisse Peamine klass loob tõhusalt kolm tüübispetsiifilist (või asukohapõhist) reklaami. Seega ainult kliendid esimeses linnas asuvast poest (City1 klient) võib olla selle linna reklaami võitja (city1 promo).

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

Seetõttu lisades ülaltoodud koodi Peamine klass annab konsoolis järgmise tulemuse:

Kui aga proovite esimese linna reklaamide võitjate nimekirja lisada kolmandat klienti, annab teie IDE kompileerimisvea.

Seda seetõttu, et mitte kumbki Jane ega Jess on esimese linna kaupluse klient. Üldiste tüüpide ja klasside loomine on kasulik, kuna see hoiab ära nende lihtsate vigade märkamata jätmise ja süsteemi andmebaasi rikkumise. Väikeses rakenduses võib selliseid vigu olla lihtne märgata, kuid ettevõtte tasemel süsteemis võivad sellised vead jääda märkamatuks.

city2promo.addCustomer(jane);

Kui asendate vigase koodirea ülalolevaga, prinditakse konsooli järgmine väljund:

Üldiste tüüpide kasutamise eelised

Selle artikli näidisrakendusest näete, et üldiste tüüpide kasutamise peamine eelis on kompileerimisaegne tüübikontroll. Ilma tüübikontrollita ei tekitaks Jane'i lisamine ühte kolmest edutamisloendist täitmisaja viga, kuna Jane on tõepoolest mööblifirma klient.

Generics hõlbustab ka mitmeid muid eeliseid, sealhulgas koodi korduvkasutatavust ja skaleeritavust. Kuna ettevõte laieneb uutesse linnadesse, saate hõlpsasti luua uusi reklaamiobjektitüüpe, tuginedes suuresti olemasolevale koodile. Üldised tüübid võimaldavad teil luua ka tõhusat koodi, mis on tarkvara arendusprotsessis esmatähtis.