Documente Academic
Documente Profesional
Documente Cultură
Analizăm următorul exemplu: Fie că avem o metodă care sortează valori de un anumit tip. Nu ne
vom referi la algoritmul de sortare utilizat . Vom atrage atenția la utilizarea algoritmului în situații
diferite.
De exemplu, o metodă care va sorta valori întregi: public class operatii{
…
public int []sort(int []array){
//algoritm de sortare
return array;
}
}
Peste un anumit timp dorim să sortăm valori de tip double sau String, ce vom face? Vom modifica
tipul de date cu care operează metoda? Sau vom scrie o altă metodă care de fapt are la bază același
algoritm?
Introducere în Programarea Generică
Aceste modalități nu sunt una din cea mai bună metodă de a scrie cod. Nu trebuie să modifici codul
de fiecare dată când apare o necesitate nouă. Scopul este , ca în asemenea cazuri , de scris o secvență
eficientă pe care mai apoi să o folosești cu succes în diferite contexte.
Dacă revenim la exemplul de mai sus, să fie așa o metodă de sortare care va putea fi utilizată atât
pentru sortarea valorilor reale cît și pentru sortarea valorilor întregi,etc nefiind necesar să îi modifici
tipul în tot codul.
Aceasta este permisă cu ajutorul programării generice care permite crearea unei porțiuni de cod
generalizat ce poate fi apelată pentru mai multe tipuri de date, și anume: clase generice, interfețe
generice, metode generice inclusiv constructori.
Metode Generice
}
Reguli cu privire la scrierea metodelor generice în Java
1. Toate declarațiile de metode generice au o secțiune delimitată prin paranteze unghiulare(<și >)
ce conține unul sau mai mulți parametri tip, separați prin virgulă ce sunt mereu plasați înainte
de tipul de return al metodei.
2. Corpul unei metode generice este declarat ca acela al oricărei alte metode. Rețineți că
parametrii de tip pot reprezenta doar tipuri de referință, nu și tipuri primitive(cum ar fi int,
double, char)
3. Putem folosi orice nume pentru parametrul tip . Cu toate acestea , T este o convenție în Java și
ar trebui să o urmăm
4. Metodele generice sunt extrem de generale și reutilizabile.
Clase generice
Java dispune de clase generice predefinite. Clasele ce fac parte din JCF toate sunt generice. Amintim
clasa ArrayList care are următoarea definiție:
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAcces,Cloneable,Serializable
<E> reprezintă parametru tip și permite listei să opereze cu orice tip de date. Astfel ați creat de
exemplu o listă de produse (ArrayList<Produs>), o listă de elevi(ArrayList<Elevi>) chiar și o listă
de valori întregi(ArrayList<Integer>). Ați operat de fapt cu aceeași clasă de creare a unei liste,
ArrayList, dar ați avut posibilitate să creați liste de diverse tipuri , chiar și clase definite proprii:
produse, elevi, angajat, etc.
Clase generice
Exemplu de clasă generică care construiește liste de valori întregi și șiruri de caractere.
import java.util.ArrayList;
Scopul programării generice import java.util.List;
este de a scrie o clasă,
public class Exemplu3 {
metodă, sau interfață pentru public static void main(String[] args) {
a o putea apela pentru List<Integer> intLista = new ArrayList<Integer>();
intLista.add(5);
diverse tipuri de date. intLista.add(7);
intLista.add(3);
intLista.add(2);
for (Integer i : intLista)
System.out.println(i + " ");
System.out.println();
List<String> strLista = new ArrayList<String>();
strLista.add("unu");
strLista.add("doi");
strLista.add("trei");
for (String i : strLista)
System.out.println(i + " ");
}
}
Exemplu
Fie că lucrăm cu baze de date ce gestionează resursele unei instituții. Am putea crea o clasă
StudentDAO desttinată special pentru transferul studenților în BD în felul următor:
La prima vedere totul este bine, vom adăuga și vom extrage un student din baza de date. Următoarea
etapă ar fi să adăugăm în BD profesorii, vom scrie la fel, un cod special și pentru asta, doar că într-o
clasă separată:
Exemplu
Pentru a evita dublarea codului și pentru a economisi timp e mai simplu de folosit în acest caz
programarea generică.
Cunoscînd facilitățile programării generice vom putea realiza o singură clasă:
Tipul parametrizat <T> al clasei semnifică orice tip, iar însăși clasa poartă denumirea de clasă generică
Exemplu
Vom folosi în felul următor această clasă:
Cu această clasă vom putea opera și cu alte resurse fără a defini o nouă clasă dar a utiliza clasa
generică și celelalte clase care am definit în acest proiect:
După cum ați văzut , putem scrie o clasă generică care funcționează cu diferite tipuri. Acest lucru
elimină redundanța și face codul mai lizibil,mai reutilizabil, și mai general. De asemenea, cînd se
adaugă un tip nou, clasa generică poate fi reutilizată fără a scrie cod suplimentar, economisind astfel
timpul dvs.
class name<T1,T2,...,Tn>{
/*...*/
}
public class Numar<T> { public class NumarInt {
private T valoare; private int valoare;
1. Parametrul tip poate fi utilizat ca tip efectiv în corpul clasei. După cum vedeți în clasa
GeneralADO, T este utilizat ca tip de parametru în metoda save() și ca tip returnare în metoda
get().
2. Parametrii de tip nu sunt adăugați niciodată după numele constructorilor sau metodelor. Sunt
utilizate doar după numele claselor și interfețelor.
3. Rețineți că dacă parametrul tip al unei metode generice nestatice este același ca și clasa de bază,
indicatorul <T> nu este necesar. Următoarea clasă ilustrează acest lucru:
Interfețe generice
interface numeInterfata<parametri_tip>{
Pentru a crea interfețe generice respectăm sintaxa: //…
}
1. Programarea generică este o extensie a programării orientate spre obiecte și definește un set de
reguli de definire și utilizare a tipurilor(clase, interfețe) și metodelor(metode, constructori)
generice.
2. Programarea generică înseamnă că aveți posibilitatea de a scrie o singură declarație de metodă
generică care poate fi apelată cu argumente de diferite tipuri. În baza tipurilor de argumente
transmise metodei generice, compilatorul gestionează în mod corespunzător fiecare apel la
metodă.
3. Deci genericitatea permite unui tip sau metode să opereze pe obiecte de diferite tipuri, oferind în
același timp siguranță la momentul compilării.
4. Programarea generică transferă erorile ce ar putea fi generate în momentul execuției la faza de
compilare, eliminînd la maxim excepția ClassCastException, asigurînd siguranța funcționării
aplicației.
Sumar