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.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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

www.informatika-programozas.hu - Ez a programozási feladat nehéz lesz!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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