Java Academy · Oppitunti

Enum-tyyppien määrittäminen ja käyttäminen

Määritä enum-tyyppejä, käytä niiden vakioita ja käy niitä läpi values()- ja ordinal()-metodeilla.

Oppitunti 1/413 vaihetta

Enum-tyyppien määrittäminen ja käyttäminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Enum-tyyppien määrittäminen ja käyttäminen

enum eli lueteltu tyyppi on erityinen luokka, joka esittää ennalta määritetyn vakiojoukon. Enum-tyypit ovat tyyppiturvallisia, luettavia ja tehokkaampia kuin staattiset int-vakiot.

Enum-tyypin määrittäminen

Käyttäkää enum-avainsanaa luetellun tyypin määrittämiseen. Jokainen vakio on implisiittisesti public static final ja luetellun tyypin ilmentymä.

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
    FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.WEDNESDAY;
System.out.println(today);          // WEDNESDAY
System.out.println(today.name());   // WEDNESDAY
System.out.println(today.ordinal()); // 2 (zero-based index)

Iterointi values()-menetelmällä

EnumType.values() palauttaa kaikki vakiot määrittelyjärjestyksessä. Käyttäkää sitä iterointiin tai valikoiden rakentamiseen.

enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE }

for (Planet p : Planet.values()) {
    System.out.println(p.ordinal() + ": " + p);
}
// 0: MERCURY
// 1: VENUS
// 2: EARTH
// ...

// Count constants
System.out.println(Planet.values().length); // 8

valueOf() ja jäsentäminen

Enum.valueOf(name) muuntaa String-merkkijonon vastaavaksi vakioksi. Se heittää IllegalArgumentException-poikkeuksen, jos vastaavaa vakiota ei löydy.

enum Status { PENDING, ACTIVE, SUSPENDED, CLOSED }

String input = "ACTIVE";
Status s = Status.valueOf(input);
System.out.println(s); // ACTIVE

try {
    Status bad = Status.valueOf("UNKNOWN");
} catch (IllegalArgumentException e) {
    System.out.println("Invalid status: UNKNOWN");
}

// Safe parse pattern
static Status safeFrom(String name) {
    try { return Status.valueOf(name.toUpperCase()); }
    catch (IllegalArgumentException e) { return Status.PENDING; }
}

Enum-tyyppien käyttäminen switch-rakenteessa

Enum-tyypit toimivat erinomaisesti switch-lauseissa ja -lausekkeissa. Nykyaikaisten switch-lausekkeiden avulla enum-arvojen käsittely on tiivistä ja kattaa kaikki vaihtoehdot.

enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED }

OrderStatus status = OrderStatus.SHIPPED;

String message = switch (status) {
    case CREATED     -> "Order received, awaiting payment";
    case PROCESSING  -> "Payment confirmed, preparing shipment";
    case SHIPPED     -> "On the way — track your package";
    case DELIVERED   -> "Delivered! Enjoy your order";
    case CANCELLED   -> "Order cancelled";
};
System.out.println(message); // On the way — track your package

Enum-tyypit if/else-rakenteissa

Vertailkaa enum-vakioita operaattorilla == – ne ovat yksittäisiä ilmentymiä, joten viitevertailu toimii oikein.

enum UserRole { GUEST, MEMBER, ADMIN, SUPERADMIN }

UserRole role = UserRole.ADMIN;

if (role == UserRole.ADMIN || role == UserRole.SUPERADMIN) {
    System.out.println("Access granted to admin panel");
} else {
    System.out.println("Access denied");
}

// Enum comparison: never use .equals() for enums
// == is correct and more readable

Enum-tyypit kokoelmissa

Enum-tyyppejä voi tallentaa tavallisiin kokoelmiin. Käyttäkää EnumSet- ja EnumMap-luokkia tehokkaaseen enum-tyyppeihin perustuvaan tallennukseen (käsitellään myöhemmässä oppitunnissa).

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN }

Set<Permission> userPerms = new HashSet<>();
userPerms.add(Permission.READ);
userPerms.add(Permission.WRITE);

System.out.println(userPerms.contains(Permission.DELETE)); // false
System.out.println(userPerms.contains(Permission.READ));   // true

List<Permission> allPerms = Arrays.asList(Permission.values());
System.out.println(allPerms.size()); // 4

Enum-tyypit toteuttavat rajapintoja

Enum-tyypit voivat toteuttaa rajapintoja, jolloin jokaiseen vakioon voidaan liittää toiminnallisuutta tai kaikille vakioille voidaan määrittää yhteinen sopimus.

interface Describable {
    String describe();
}

enum Season implements Describable {
    SPRING, SUMMER, FALL, WINTER;

    public String describe() {
        return switch (this) {
            case SPRING -> "Mild and rainy";
            case SUMMER -> "Hot and sunny";
            case FALL   -> "Cool with falling leaves";
            case WINTER -> "Cold and snowy";
        };
    }
}

for (Season s : Season.values()) {
    System.out.println(s + ": " + s.describe());
}

Enum-tyyppi tilakoneena

Enum-tyypit sopivat luontevasti tilakoneisiin. Jokainen vakio esittää yhtä tilaa, ja menetelmät määrittävät sallitut siirtymät.

enum TrafficLight {
    RED, YELLOW, GREEN;

    public TrafficLight next() {
        return switch (this) {
            case RED    -> GREEN;
            case GREEN  -> YELLOW;
            case YELLOW -> RED;
        };
    }
}

TrafficLight light = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(light);
    light = light.next();
}
// RED, GREEN, YELLOW, RED, GREEN, YELLOW

Enum-tyyppien parhaat käytännöt

Noudattakaa enum-tyyppejä käyttäessänne seuraavia parhaita käytäntöjä:

  • Käyttäkää vakioille ALL_CAPS-nimiä (käytäntö)
  • Suosikaa enum-tyyppejä int- tai String-vakioiden sijaan tyyppiturvallisuuden vuoksi
  • Käyttäkää switch-lausekkeita, jotka kattavat kaikki vaihtoehdot
  • Lisätkää enum-tyyppeihin kenttiä ja menetelmiä, kun vakioihin liittyy tietoja

Käytännössä: HTTP-tilakoodit

Esimerkki käytännön enum-tyypistä, joka mallintaa HTTP-tilakoodiluokkia ja tarjoaa tehdasmenetelmän numeerisesta koodista luomiseen.

enum HttpStatus {
    OK(200), CREATED(201), BAD_REQUEST(400),
    UNAUTHORIZED(401), NOT_FOUND(404), SERVER_ERROR(500);

    public final int code;

    HttpStatus(int code) { this.code = code; }

    public static HttpStatus from(int code) {
        for (HttpStatus s : values())
            if (s.code == code) return s;
        throw new IllegalArgumentException("Unknown HTTP code: " + code);
    }

    public boolean isSuccess() { return code >= 200 && code < 300; }
}

HttpStatus s = HttpStatus.from(404);
System.out.println(s + " (" + s.code + ") success=" + s.isSuccess());
// NOT_FOUND (404) success=false

Pikatarkistus

Mikä on seuraavan koodin tuloste?

enum Color { RED, GREEN, BLUE }
System.out.println(Color.GREEN.ordinal());

Kertaus: enum-tyyppien määrittäminen ja käyttäminen

Keskeiset opit:

  • Enum-tyypit määrittävät tyyppiturvallisen joukon nimettyjä vakioita
  • values() käy läpi kaikki vakiot; ordinal() palauttaa nollapohjaisen indeksin
  • valueOf() muuntaa String-merkkijonon vastaavaksi vakioksi
  • Käyttäkää enum-ilmentymien vertailuun ==-operaattoria, älkää equals-menetelmää
  • Enum-tyypit sopivat erinomaisesti kaikki vaihtoehdot kattaviin switch-lausekkeisiin
  • Enum-tyypit voivat toteuttaa rajapintoja, jolloin kuhunkin vakioon voidaan liittää oma toiminta
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Enum-tyyppien määrittäminen ja käyttäminen” ilmainen?

Kyllä – oppitunnin ”Enum-tyyppien määrittäminen ja käyttäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Enum-tyyppien määrittäminen ja käyttäminen”?

Määritä enum-tyyppejä, käytä niiden vakioita ja käy niitä läpi values()- ja ordinal()-metodeilla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Enum-tyyppien määrittäminen ja käyttäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Enum-tyyppien määrittäminen ja käyttäminen
  2. Kentät ja metodit enum-tyypeissä
  3. Switch-lausekkeet enum-tyypeillä
  4. EnumSet ja EnumMap
← Takaisin: Java Academy