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.
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); // 8valueOf() 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 packageEnum-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 readableEnum-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()); // 4Enum-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, YELLOWEnum-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=falsePikatarkistus
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
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
- Enum-tyyppien määrittäminen ja käyttäminen
- Kentät ja metodit enum-tyypeissä
- Switch-lausekkeet enum-tyypeillä
- EnumSet ja EnumMap