Sunteți pe pagina 1din 5

Disciplina: Metode avansate de programare

Cadru didactic: Ralf Fabian


Specializarea: Informatică, anul II.

Enum în Java
Într-un limbaj de programare, prin enumerări se poate reprezenta un grup de constante denumite.
Tipul enumerativ este un tip special de date ce permite ca pentru o variabilă să existe un număr
predefinit de constante. Variabila trebuie să fie egală cu una dintre valorile predefinite pentru ea.

Exemple de tipuri enumerative pot fi considerate plantele sistemului solar, zilele săptămânii, lunile
anului, puncte cardinale, culori, etc. Enums sunt utilizate atunci când se cunosc toate valorile
posibile la timpul compilării.

În limbajul Java, tipurile enumerative sunt prezente începând cu versiunea JDK 1.5, sub forma
tipului de date enum. Spre deosebire de C/C++, tipurile de date enum pot conține variabile, metode
și constructori.

Declararea unui enum


Un tip enumerativ se declară cu ajutorul cuvântului enum și poate fi declarat în afara unei clase sau
în interiorul unei clase.

Enum în afara clasei

enum PixelColor {
RED, GREEN, BLUE;
}

public class Test {

public static void main(String[] args) {


PixelColor c = PixelColor.RED;
System.out.println(c);
}
}

Enum în interiorul clasei

public class Test {

enum PixelColor {
RED, GREEN, BLUE;
}

public static void main(String[] args) {


PixelColor c = PixelColor.RED;
System.out.println(c);
}
}

1
 Conform specificațiilor de formatare pentru limbajul Java, este recomandat ca constantele să
fie scrise cu majuscule.
 Primul rând din enum este lista de constante urmată pe urmă de alte elemente ca variabile,
constructori sau metode.
 Intern, un enum este reprezentat prin clase. Fiecare constantă enum reprezintă un obiect de
tip enum.
 Orice constantă enum este implicit public static final, ca urmare poate fi accesată direct
prin numele tipului enum.
 Tipuri enum pot fi folosite în instrucțiuni swich.

Enum și swich

// Enum class
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

public class Test {


Day day;

// Constructor
public Test(Day day) {
this.day = day;
}

public void dayIsLike() {


switch (day) {
case MONDAY:
System.out.println("Mondays are bad.");
break;
case FRIDAY:
System.out.println("Fridays are better.");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Weekends are best.");
break;
default:
System.out.println("Midweek days are so-so.");
break;
}
}

public static void main(String[] args) {


String str = "MONDAY";
Test t1 = new Test(Day.valueOf(str));
t1.dayIsLike();
}
}

 În interiorul unui enum poate fi declarată și metoda main, așadar un enum poate fi invocat
(de la consolă) pentru lansarea în execuție a aplicației.

2
Main în enum

enum PixelColor {
RED, GREEN, BLUE;

public static void main(String[] args) {


PixelColor c = PixelColor.RED;
System.out.println(c);
}
}

Moștenire și metode moștenite

 Implicit orice enum moștenește clasa java.lang.Enum și nu poate moșteni altceva.


 Enum poate în schimb implementa mai multe interfețe.
 Metoda toString() este suprascrisă în clasa java.lang.Enum și returnează numele constantei
din enum.

În calsa java.lang.Enum sunt prezente metodele values(), ordinal() și valueOf() cu următoarea


funcționalitate:
 values() - returnează toate valorile dintr-un enum;
 ordinal() - permite aflarea fiecărui index de constantă din enum, asemenea unui index dintr-
un array, întrucât într-un eunum ordinea constantelor este importantă;
 valueOf() - returnează constanta enum a valorii, de tip String, specificată ca argument la
metodă;

enum PixelColor {
RED, GREEN, BLUE;
}

public class Test {


public static void main(String[] args) {
// Calling values()
PixelColor arr[] = PixelColor.values();

// enum with loop


for (PixelColor col : arr) {
// Calling ordinal()
System.out.println(col + " at index " + col.ordinal());
}

// Using valueOf()
System.out.println(PixelColor.valueOf("GREEN"));
// System.out.println(Color.valueOf("WHITE"));
// IllegalArgumentException
}
}

3
Constructor și metode
 Enum poate conține constructor. Acesta este apelat separat pentru fiecare constantă enum la
momentul încărcării clasei enum.
 Un constructor enum nu poate fi apelat direct pentru că nu pot fi create obiecte enum în mod
explicit.
 Enum poate conține metode concrete dar nu și metode abstracte.

enum PixelColor {
RED, GREEN, BLUE;

// enum constructor
private PixelColor() {
System.out.println("Constructor for : " + this.toString());
}

// only concrete methods allowed


public void getInfo() {
System.out.println("RGB Color");
}
}

public class Test {

public static void main(String[] args) {


PixelColor c = PixelColor.RED;
System.out.println(c);
c.getInfo();
}
}

Implicit, constantele din enum au valoarea lor proprie ca String, dar ele pot primi și alte valori. În
acest sens, se creează un constructor cu parametru în clasa enum curentă. Cum un enum nu poate fi
folosit la instanțiere de obiecte, constructorul va trebuie să aibă modificatorul de acces implicit sau
private. În plus, trebuie adăugată o metodă getter pentru a obține valorile din enum.

enum PixelColor {
RED("ROSU"), GREEN("VERDE"), BLUE("ALBASTRU");

private String data;

// enum constructor
private PixelColor(String data) {
this.data = data;
System.out.println("Constructor for : " + this.toString());
}

// getter method
public String getData() {
return this.data;
}
}

4
public class Test {

public static void main(String[] args) {


PixelColor[] c = PixelColor.values();
for (PixelColor color : c)
System.out.println("name: " + color + " data: " +
color.getData());
}
}

Output:

Constructor for : RED


Constructor for : GREEN
Constructor for : BLUE
name: RED data: ROSU
name: GREEN data: VERDE
name: BLUE data: ALBASTRU