CyberStars

Enums

Imaginează-ți că programezi un sistem de misiuni în Vice City și trebuie să reprezinți vremea curentă: însorit, ploios, cu ceață sau furtună. Ai putea folosi String-uri precum "insorit" și "ploios", dar cineva ar putea scrie din greșeală "insort" și codul tău nu ar prinde greșeala decât la rulare. Aici intervin enum-urile

Un enum (prescurtare de la enumerare) este un tip special care reprezintă un set fix de valori cu nume. Odată ce le definești, acelea sunt singurele opțiuni valide

enum Vreme {
    INSORIT, PLOIOS, CETOS, FURTUNOS
}

public class Main {
    public static void main(String[] args) {
        Vreme azi = Vreme.INSORIT;
        System.out.println("Vremea de azi: " + azi);
    }
}

Ieșire

Vremea de azi: INSORIT

Prin convenție, valorile enum se scriu cu MAJUSCULE_CU_UNDERSCORE. Le accesezi cu numele enum-ului, un punct, apoi valoarea: Vreme.INSORIT


Dacă încerci să folosești o valoare care nu există în enum, compilatorul oprește totul înainte ca programul să ruleze

enum Vreme {
    INSORIT, PLOIOS, CETOS, FURTUNOS
}

public class Main {
    public static void main(String[] args) {
        Vreme v = Vreme.PLOIOS;     // functioneaza
        Vreme v2 = Vreme.NINSOARE;  // EROARE: NINSOARE nu exista in Vreme
    }
}

Compilatorul prinde greșeala înainte ca programul să pornească. Asta e una dintre superputerile Java


Enum-urile funcționează perfect cu instrucțiunile switch. Fiecare caz se ocupă de o valoare posibilă

enum Arma {
    PISTOL, PUSCA, AUTOMAT, LANSATOR_RACHETE
}

public class Main {
    public static void descrieArma(Arma a) {
        switch (a) {
            case PISTOL:
                System.out.println("O arma de incredere. Daune mici, precizie mare.");
                break;
            case PUSCA:
                System.out.println("Devastatoare de aproape. Preferata lui Tommy.");
                break;
            case AUTOMAT:
                System.out.println("Rata de foc mare. Bun pentru misiuni intense.");
                break;
            case LANSATOR_RACHETE:
                System.out.println("Exagerare? N-am auzit de asa ceva.");
                break;
        }
    }

    public static void main(String[] args) {
        descrieArma(Arma.PUSCA);
        descrieArma(Arma.AUTOMAT);
    }
}

Ieșire

Devastatoare de aproape. Preferata lui Tommy.
Rata de foc mare. Bun pentru misiuni intense.

În interiorul switch-ului scrii doar PISTOL, nu Arma.PISTOL. Java știe deja că faci switch pe un Arma, așa că te lasă să sari peste prefix


Poți parcurge toate valorile unui enum folosind metoda values()

enum Gasca {
    VERCETTI, CUBANS, BIKERS, DIAZ
}

public class Main {
    public static void main(String[] args) {
        for (Gasca g : Gasca.values()) {
            System.out.println(g);
        }
    }
}

Ieșire

VERCETTI
CUBANS
BIKERS
DIAZ

Gasca.values() returnează un array cu toate constantele enum în ordinea în care au fost declarate. Util când vrei să procesezi fiecare opțiune


Când să folosești enum-uri în loc de String-uri?

  • Enum-uri: când ai un set fix și cunoscut de opțiuni: zilele săptămânii, anotimpurile, nivelurile de dificultate, stările jocului
  • String-uri: când valoarea e liberă sau provine de la utilizator: nume de jucători, mesaje, căi de fișiere

Dacă te trezești scriind if (status.equals("activ") || status.equals("inactiv") || ...), probabil vrei un enum


Misiune: Raportul Afacerilor

Tommy are mai multe afaceri în Vice City și vrea un raport rapid. Fiecare afacere poate fi într-una din câteva stări fixe: produce bani, e închisă temporar, e în renovare sau a fost distrusă de o bandă rivală. De exemplu, Malibu Club merge bine și produce bani, Print Works e în renovare, Boatyard e închis temporar, iar Kaufman Cabs a fost distrus de o bandă rivală

Definește stările posibile ca un set fix de valori (Stare). Scrie o metodă descrieStare care primește o stare și afișează ce înseamnă. În main, stochează cele patru nume de afaceri într-un array nume (unul pentru fiecare stare, în aceeași ordine ca valorile enum-ului). Apoi parcurge Stare.values(); pentru fiecare stare, afișează numele afacerii corespunzătoare urmat de " - ", apoi descrie starea.

Exemplu

Malibu Club - Activa: produce bani in fiecare zi
Boatyard - Inchisa: nu genereaza venit momentan
Print Works - Renovare: se lucreaza, deschidere in curand
Kaufman Cabs - Distrusa: trebuie reconstruita de la zero