Elméleti alapozás
Enumeráció
Az enumeráció (enumeration) fogalommal először Homérosz Iliász című monumentális művében találkozhattunk, ott nagyjából seregszemlét jelent, amely során sorra veszik az eposzban szereplő hősöket és érdemeiket. A fogalom Java-alapú magyarázata "kissé" különböző, bár jobban belegondolva hasonló jelentéstartalommal bír.
A Java nyelvben az enumeráció konstans adatok állandó és fix méretű csoportját jelenti.
A konstans jellegű adatokról részletesen olvashatunk az Ami a változót (és a többieket) változatlanná teszi: a final című fejezetben. Melyek lehetnek ezek? Azok, amelyek garantáltan nem fognak megváltozni, vagy egyenesen tiltott, sőt értelmetlen megváltoztatni. Nézzük meg a legáltalánosabbakat, amelyeket persze értelemszerűen minden nap használunk:
public enum Torpek {
HAPCI, KUKA, MORGÓ, TUDOR, SZUNDI, VIDOR, SZENDE
}
public enum Napok {
HÉTFŐ, KEDD, SZERDA, CSÜTÖRTÖK, PÉNTEK, SZOMBAT, VASÁRNAP
}
public enum Egtajak {
ÉSZAK, KELET, DÉL, NYUGAT
}
public enum Evszakok {
TAVASZ, NYÁR, ŐSZ, TÉL
}
public enum Honapok {
JANUÁR, FEBRUÁR, MÁRCIUS, ÁPRILIS, MÁJUS, JÚNIUS, JÚLIUS,
AUGUSZTUS, SZEPTEMBER, OKTÓBER, NOVEMBER, DECEMBER
}
Láthatjuk, hogy az enumeráció adatszerkezetét az enum kulcsszó vezeti be, deklarálása egyfelől egy előre feltöltött tömb, másfelől egy külső metódus létrehozásához hasonlít, lényegében a 2 objektum formai ötvözete:
public enum Evszakok {
TAVASZ, NYÁR, ŐSZ, TÉL
}
Összehasonlításképpen:
String[] tombEvszakok = new String[] {"TAVASZ", "NYÁR", "ŐSZ", "TÉL"};
Mivel azonban az enumeráció statikus és konstans adatokat tartalmaz, a szerkezetet osztályszinten kell deklarálnunk, amelyet más programtagok is láthatnak:
public class Main {
public enum Evszakok{
TAVASZ, NYÁR, ŐSZ, TÉL
}
public static void main(String[] args) {
System.out.println(Evszakok.TÉL);
}
}
Végeredmény:
TÉL
A fenti kódban a System.out.println() metódus elővarázsolta nekünk az Evszakok enumeráció TÉL értékét anélkül, hogy az objektum létrehozásáról nekünk kellett volna gondoskodni. Ezt azonban megtehetjük közvetetten is (Evszakok evszakok = Evszakok.TÉL;), amely során érdekesmód nem kell felhasználnunk a new parancsot:
public class Main {
public enum Evszakok{
TAVASZ, NYÁR, ŐSZ, TÉL
}
public static void main(String[] args) {
Evszakok evszakok = Evszakok.TÉL;
System.out.println(evszakok);
}
}
Végeredmény:
TÉL
Természetesen az enumerációs adatszerkezet tartalma listázható. Nézzük meg a minden elemhez hozzáférést biztosító foreach ciklussal:
public class Main {
public enum Evszakok{
TAVASZ, NYÁR, ŐSZ, TÉL
}
public static void main(String[] args) {
for(Evszakok evszakok : Evszakok.values()) {
System.out.println(evszakok);
}
}
}
Végeredmény:
TAVASZ
NYÁR
ŐSZ
TÉL
Az enumeráció azonban ennél jóval többre is képes, ezt szintén a Java-rendszer biztosítja számunkra. Képesek vagyunk az enumerációt önállóan futtatható osztályként definiálnunk. Az alábbi futtatható, SI és angolszász mértékegységváltó Java-kód az A&K Java Akadémia oktatási anyagából származik:
public enum SILengthConverter {
MM(1000.0, "mm"), CM(100.0, "cm"), DM(10.0, "dm"), M(1.0,
"m"), KM(0.001, "km"),
FEET(3.2808399, "ft" ), YARD(1.0936133, "yd" ),
MILE(0.000621371192, "mi");
private final double conversionRate;
private final String unit;
private SILengthConverter(double conversionRate, String unit) {
this.conversionRate = conversionRate;
this.unit = unit;
}
public double convert(double unit) {
return unit * conversionRate;
}
public String getUnit() {
return unit;
}
public static void main(String[] args) {
double meters = 1.0;
for(SILengthConverter sILengthConverter :
SILengthConverter.values()) {
System.out.print(meters + " m = " + sILengthConverter.convert(meters)
+ " " + sILengthConverter.getUnit() + "\n");
}
}
}
Végeredmény:
1.0 m = 1000.0 mm
1.0 m = 100.0 cm
1.0 m = 10.0 dm
1.0 m = 1.0 m
1.0 m = 0.001 km
1.0 m = 3.2808399 ft
1.0 m = 1.0936133 yd
1.0 m = 6.21371192E-4 mi