Sunteți pe pagina 1din 9

Enumerările (sau enum) sunt o tehnologie de programare care se

găsește în multe limbaje de programare. Cu toate acestea, enumerările


nu au făcut parte din specificația Java inițială. Unul dintre motivele
pentru acest lucru este că enumerările sunt mai degrabă o convenție
decât o nevoie. Însă, pe măsură ce timpul a trecut, mulți programatori
și-au dorit ca Java să implementeze suportul pentru enumerări, fiindcă
sunt o soluție elegantă și structurată pentru diverse probleme. Dorința
lor a devenit realitate începând cu versiunea 5.

Pe scurt, enumerările sunt liste de constante denumite ce definesc un


nou tip de dată. Cu alte cuvinte, enumerarea este un tip complex de
date ce este alcătuit dintr-un număr fix de constante.

Enumerările se întâlnesc adesea în viața reală. Un exemplu de


enumerare sunt lunile anului sau zilele săptămânii. Din perspectiva
unui programator, enumerările sunt utile atunci când dorim să definim
un set de valori ce reprezintă o colecție de constante despre care știm
că nu se vor schimba.

Enumerarea este un tip de dată și, la fel ca orice alt tip complex,
respectă toate regulile de declarare a unui tip complex. O putem defini
în cadrul unei clase sau ca o clasă separată (într-un document
separat).

Iată un exemplu de enumerare denumită DaysOfWeek:

public class TestClass {

public enum DaysOfWeek {

MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY


}

//use of enumeration inside of main method


public static void main(String[] args) {

System.out.println(DaysOfWeek.WEDNESDAY);
}
}

Identificatorii MONDAY, THUESDAY, WEDNESDAY etc. sunt cunoscuți


drept constante ale enumerării. Fiecare dintre ei sunt declarați implicit
ca element static și public al enumerării DaysOfWeek. Odată definită, o
enumerare se poate utiliza pentru a crea variabile. Deși enumerările
definesc tipuri de clase, ele nu sunt instanțiate folosind cuvântul cheie
new. Spre deosebire de acestea, variabilele enumerării sunt declarate
în mod similar cu variabilele primitive. Pentru a declara o variabilă de
tip DaysOfWeek, trebuie să facem următoarele:

DaysOfWeek days;

Accesăm membrii acestei enumeraţii prin selectorul DaysOfWeek


(denumirea enumerării). Aceasta datorită faptului că enumerarea se
află în cadrul clasei curente. Enumerarea ar avea acelaşi tratament şi
dacă am declara-o într-un document separat, ca forma separată,
independentă.

Însă, dacă am dori să activăm enumerarea în afara gamei clasei


Main (ca în cazul precedent), ar trebui să asociem selectorului şi
numele clasei:

Main.DaysOfWeek.WEDNESDAY

De asemenea, putem vedea că enumerarea creată este tratată ca un


tip de date în cadrul mediului de dezvoltare NetBeans. Când
introducem denumirea enumerării și semnul punct, obținem o listă cu
constantele definite în enumerare.
Imaginea 21.1 Utilizarea constantelor enumerării

Când începem să creăm o enumerare, putem adăuga una sau mai


multe valori elementelor sale (ca în cazul unei clase). Aceste valori
sunt stocate între paranteze la finalul fiecărui element al enumerării și
este necesar ca acestea să fie procesate în definiția enumerării. De
exemplu, dacă dorim ca fiecare zi a săptămânii să aibă o valoare, vom
scrie astfel:

public class TestClass {

public enum DaysOfWeek {

MONDAY(1), THUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SU


NDAY(7);

public int position;

DaysOfWeek(int i) {
this.position = i;
}
}
//use of enumeration inside of main method
public static void main(String[] args) {

System.out.println(DaysOfWeek.friday.position);

}
}

Câmpul position reprezintă o valoare întreagă adițională pe care am


legat-o cu denumirea fiecărei zi a săptămânii. Constructorul trebuie să
aibă un modificator de acces private sau package-private, având în
vedere că nu putem crea enumerările în mod independent, prin
apelarea constructorului.

În exemplul de mai sus, vedem că putem accesa câmpul position în


modul următor:

DaysOfWeek.friday.position,

Vom obține valoarea 5 la ieșire.

Dacă folosim această metodă de construcție a enumerării


(parametrizată), toate elementele trebuie să aibă un parametru.
Următoarea linie va cauza o eroare, fiindcă nu există niciun parametru
pentru elementul Thursday.

MONDAY(1), THUESDAY(2), WEDNESDAY(3), THURSDAY, FRIDAY(5),


SATURDAY(6), SUNDAY(7);

De asemenea, după ce am creat enumerarea, structura sa nu mai


poate fi modificată ulterior (prin adăugarea sau eliminarea
elementelor) în timpul execuției programului.
Afișarea elementelor enumerării

Numărul de elemente ale unei enumerări pot fi obținute prin utilizarea


proprietății length a metodei values. Din acest motiv, următorul cod va
afișa numărul 7 la ieșire (deoarece avem 7 elemente în enumerare).

System.out.println(DaysOfWeek.values().length);

Utilizând bucla și metoda values, putem afișa toate elementele


enumerării:

for (DaysOfWeek dow : DaysOfWeek.values()) {


System.out.println(dow);
}

Sau

for (int i = 0; i < DaysOfWeek.values().length; i++) {


System.out.println(DaysOfWeek.values()[i]);
}

Utilizarea enumerărilor în structura switch pentru a procesa


valorile textuale

Enumerările se folosesc adesea în cadrul structurilor switch pentru a


verifica anumite valori și execuția logicii. Haideți să privim următorul
exemplu:

public enum DaysOfWeek {

MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;


}

public static void main(String[] args) {


DaysOfWeek daysOfWeek = DaysOfWeek.WEDNESDAY;
switch (daysOfWeek) {
case MONDAY:
System.out.println("Day is MONDAY");
break;
case TUESDAY:
System.out.println("Day is TUESDAY");
break;
case WEDNESDAY:
System.out.println("Day is WEDNESDAY");
break;
case THURSDAY:
System.out.println("Day is THURSDAY");
break;
case FRIDAY:
System.out.println("Day is FRIDAY");
break;
case SATURDAY:
System.out.println("Day is SATURDAY");
break;
case SUNDAY:
System.out.println("Day is SUNDAY");
break;
}
}

În codul de mai sus, am transmis enumerarea DaysOfWeek cu


denumirea daysOfWeek ca parametru al construcției switch.
Constantele enumerării sunt definite ca valori verificate în cadrul
clasei.

Exemplul anterior este corect, dar imaginați-vă ce s-ar întâmpla dacă


data ar fi venit în formă textuală. În acel caz, ar fi trebuit să convertim
cumva stringul într-un tip (constantă) de enumerare.

Datele vor veni de obicei în formă textuală (în special de pe web),


motiv pentru care există o metodă încorporată ce convertește stringul
într-un tip de enumerare.
String day = "MONDAY";
DaysOfWeek daysOfWeek = DaysOfWeek.valueOf(day);

În acest mod, vom converti stringul într-o constantă a enumerării.


Stringul transmis metodei valueof este stringul cu valoarea MONDAY.
Însă, în cazul în care o astfel de valoare nu există în cadrul enumerării,
vom obține o excepție.

Concluzia logică este că trebuie să utilizăm blocurile try catch pentru a


manipula excepțiile.

String day = "MONDAY";

DaysOfWeek daysOfWeek = null;

try
{
daysOfWeek = DaysOfWeek.valueOf(day);
}
catch(Exception exc)
{
System.out.println(exc);
}

Întrebarea pe care trebuie să ne-o adresăm este ce se va întâmpla


dacă acest cod rezultă cu o excepție? Cu alte cuvinte, ce se va
întâmpla dacă:

String day = "OtherValue";

Este clar că variabila daysOfWeek va avea valoarea null, având în


vedere că va apărea o excepție în blocurile try/catch. Din cauza unor
astfel de situații, trebuie să definim o constantă pentru o valoare
nedefinită:

public enum DaysOfWeek {


MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,
SUNDAY, UNSPECIFIED;
}

Putem modifica acum codul în modul următor:

public enum DaysOfWeek {

MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, UNSPE


CIFIED;

public static void main(String[] args) {


String day = "MONDAY";

DaysOfWeek daysOfWeek = DaysOfWeek.UNSPECIFIED;

try
{
daysOfWeek = DaysOfWeek.valueOf(day);
}
catch(Exception exc)
{
System.out.println(exc);
}

switch (daysOfWeek) {
case MONDAY:
System.out.println("Day is MONDAY");
break;
case TUESDAY:
System.out.println("Day is TUESDAY");
break;
case WEDNESDAY:
System.out.println("Day is WEDNESDAY");
break;
case THURSDAY:
System.out.println("Day is THURSDAY");
break;
case FRIDAY:
System.out.println("Day is FRIDAY");
break;
case SATURDAY:
System.out.println("Day is SATURDAY");
break;
case SUNDAY:
System.out.println("Day is SUNDAY");
break;
case UNSPECIFIED:
System.out.println("Input error");
break;
}
}

Putem vedea că constanta enumerării este setată la valoarea


constantei nedefinite:

DaysOfWeek daysOfWeek = DaysOfWeek.UNSPECIFIED;

Chiar și în cazul unei excepții, valoarea acestei variabile va


rămâne UNSPECIFIED.

Am adăugat un caz în cadrul structurii switch care va acoperi situația


unei valori nedefinite.

S-ar putea să vă placă și