Clasele generice facilitează reutilizarea. Faceți-vă codul scalabil și eficient folosind clase generice în Java.
Generics este un concept de programare care vă permite să specificați tipul pe care intenționați să îl stocați într-o colecție. Un tip generic poate fi orice valoare neprimitivă. Parametrii de tip tradițional cu care ați putea fi familiarizat sunt șir și întreg.
Cu toate acestea, puteți crea un tip generic unic. În plus, puteți crea o clasă generică și o puteți utiliza pentru a crea colecții diferite folosind generice.
Crearea unui tip generic
Un tip generic este în esență un obiect, creat folosind o clasă sau o interfață. Deci, pentru acest articol, tipul generic va fi un client. Folosind un exemplu de aplicație la nivel de întreprindere, clientul reprezintă o entitate într-un sistem de baze de date. Acest sistem de baze de date deservește o companie de mobilă care are trei locații fizice în trei orașe diferite.
publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Veți observa abstract cuvânt cheie în Client declarația de clasă de mai sus. Înseamnă că nu puteți crea un tip direct sau un obiect din Client tip.
Având în vedere că fiecare locație fizică de magazin va avea o listă unică de clienți, aplicația va trebui să aibă trei subclase de clienți pe care le veți implementa folosind conceptul de programare a moștenirii.
Aceste trei subclase vor fi tipurile solide la generic Client tip. Primul Client subclasa va conține următorul cod:
publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}
Crearea unei clase generice
Pentru a utiliza un tip generic, va trebui să aveți o clasă sau o metodă generică care acceptă acest tip ca parametru. Pentru a crea o clasă generică, trebuie pur și simplu să inserați parametrul de tip în declarația clasei.
publicclassPromotion<T> {}
Codul de mai sus indică faptul că Promovare clasa este generică. Aceasta înseamnă că Promovare clasa folosește tipuri pentru a-și crea obiectele. Acum, declarația clasei poate lua o colecție de obiecte care sunt șiruri de caractere, numere întregi, clienți și așa mai departe. Cu toate acestea, firma de mobilă vrea doar Promovare clasa pentru a crea obiecte folosind Client tipuri.
publicclassPromotion<TextendsCustomer> {}
Codul actualizat de mai sus asigură că Promovare clasa ia doar Client tipuri, aceasta înseamnă toate subclasele ale Client clasă.
Având în vedere că există trei magazine, compania dorește să creeze o promoție independentă pentru fiecare magazin. Datele necesare pentru aceste promoții sunt similare. Fiecare promoție va avea un nume și o colecție de clienți care au câștigat în promoția respectivă.
Există mai multe moduri de a aborda această problemă. Ai putea crea un Promovare clasa părinte și au trei subclase pentru fiecare locație de magazin. Dar din moment ce fiecare Promovare are o structură similară, veți ajunge să scrieți cod duplicat, ceea ce este ineficient (mai ales că lucrați deja cu Client subclase).
Prin urmare, a Promovare clasa generică este una dintre cele mai eficiente soluții la această problemă.
import java.util.ArrayList;
publicclassPromotion<TextendsCustomer> {
private String promoName;
private ArrayListwinners = 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 Promovare clasa generică are o singură variabilă (promoName). Această clasă Java acceptă o colecție de clienți care au câștigat promoția (câștigători) și îi stochează într-un Structura de date ArrayList. Pentru a adăuga un client nou la o anumită colecție promoțională, ar trebui să utilizați addCustomer() metodă. Dacă în orice moment doriți să aflați numărul de clienți care se află într-o colecție, puteți invoca numWinners() metodă.
Crearea colecțiilor utilizând o clasă generică
Înainte de a începe să creați colecții, va trebui să creați clienți.
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 Principal clasa de mai sus creează patru obiecte client, fiecare aparținând uneia dintre cele trei locații de magazin. Pentru a începe să creați colecții, va trebui să creați mai întâi obiecte de promovare (câte unul pentru fiecare locație de magazin).
Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");
Inserarea celor trei linii de cod de mai sus în Principal clasa va crea efectiv trei promoții specifice tipului (sau specifice locației). Deci, doar clienții din magazinul din prima locație din oraș (Oraș1 Client) poate fi un câștigător în promoția orașului respectiv (city1promo).
city1promo.addCustomer(john);
city1promo.addCustomer(kelly);
Prin urmare, adăugarea codului de mai sus la Principal clasa va produce următorul rezultat în consolă:
Cu toate acestea, dacă încercați să adăugați un al treilea client la lista câștigătorilor promoției din primul oraș, IDE-ul dvs. ar produce o eroare de compilare.
Asta pentru că nici unul Jane nici Jess este client al magazinului din primul oraș. Crearea de tipuri și clase generice este utilă, deoarece împiedică aceste erori simple să rămână neprinse și să corupeze baza de date a unui sistem. Într-o aplicație mică, poate fi ușor să detectați erori de acest fel, dar într-un sistem la nivel de întreprindere, erorile de acest fel ar putea rămâne nedepistate.
city2promo.addCustomer(jane);
Înlocuirea liniei eronate de cod cu cea de mai sus va imprima următoarea ieșire pe consolă:
Beneficiile utilizării tipurilor generice
Din exemplul de aplicație din acest articol, puteți vedea că un avantaj major al utilizării tipurilor generice este verificarea tipului la compilare. Fără verificarea tipului, adăugarea lui Jane la oricare dintre cele trei liste de promovare nu ar produce o eroare de execuție, întrucât Jane este într-adevăr un client al companiei de mobilă.
Genericurile facilitează, de asemenea, câteva alte avantaje, inclusiv reutilizarea codului și scalabilitatea. Pe măsură ce compania se extinde în orașe noi, puteți crea cu ușurință noi tipuri de obiecte de promovare, bazându-vă în mare măsură pe codul existent. Tipurile generice vă permit, de asemenea, să creați cod eficient, care este o prioritate de top în procesul de dezvoltare a software-ului.