Enumit kenttien ja metodien kanssa
Lisää enum-tyypeille toimintaa.
Enumit kenttien ja metodien kanssa 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-tyypit ovat kokonaisia luokkia
Java-enum on paljon enemmän kuin vakioiden luettelo. Se on todellinen luokka, jonka instansseja vakiot ovat.
Tämä tarkoittaa, että enum-tyypeillä voi muiden luokkien tapaan olla kenttiä, konstruktoreita ja metodeja.
public class Main {
enum Direction { NORTH, SOUTH, EAST, WEST }
public static void main(String[] args) {
Direction d = Direction.NORTH;
System.out.println(d + " is a " + d.getClass().getSuperclass().getSimpleName());
}
}Kentän lisääminen
Jokaiseen vakioon voi liittää tietoja. Ilmoittakaa final-kenttä ja konstruktori, ja välittäkää arvot sulkeissa kunkin vakion perässä.
public class Main {
enum Planet {
EARTH(9.81), MARS(3.71), JUPITER(24.79);
private final double gravity;
Planet(double gravity) { this.gravity = gravity; }
double gravity() { return gravity; }
}
public static void main(String[] args) {
System.out.println("Mars gravity: " + Planet.MARS.gravity());
}
}Enum-konstruktori on private
Enum-konstruktorit ovat implisiittisesti private-konstruktoreita. Enum-tyypille ei voi kutsua new-operaattoria; JVM luo vakiot kerran luokan latauksen yhteydessä.
Tämä takaa, että instansseja on kiinteä ja rajallinen määrä.
public class Main {
enum Coin {
PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
private final int cents;
Coin(int cents) { this.cents = cents; }
int cents() { return cents; }
}
public static void main(String[] args) {
int total = Coin.QUARTER.cents() + Coin.DIME.cents();
System.out.println("Total cents: " + total);
}
}Useita kenttiä
Vakioon voi liittyä useita tietoja. Tässä jokainen planeetta sisältää sekä massan että säteen.
public class Main {
enum Planet {
EARTH(5.976e24, 6.37814e6),
MARS(6.421e23, 3.3972e6);
private final double mass, radius;
Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
public static void main(String[] args) {
System.out.printf("Earth g = %.2f%n", Planet.EARTH.surfaceGravity());
}
}Instanssimetodit
Enum-metodit voivat laskea tuloksia vakion omien kenttien perusteella aivan tavallisten instanssimetodien tapaan.
public class Main {
enum Size {
SMALL(8), MEDIUM(12), LARGE(16);
private final int ounces;
Size(int ounces) { this.ounces = ounces; }
int ounces() { return ounces; }
double liters() { return ounces * 0.0295735; }
}
public static void main(String[] args) {
System.out.printf("Large = %.2f L%n", Size.LARGE.liters());
}
}Sisäänrakennettu nimi ja järjestysnumero
Jokainen enum-tyyppi saa metodit name() (tarkan tunnisteen) ja ordinal() (nollasta alkavan sijainnin).
Omat tiedot kannattaa tallentaa sen sijaan, että luotettaisiin metodiin ordinal(), sillä vakioiden järjestyksen muuttaminen rikkoo tällaisen koodin.
public class Main {
enum Day { MON, TUE, WED }
public static void main(String[] args) {
for (Day d : Day.values()) {
System.out.println(d.name() + " -> ordinal " + d.ordinal());
}
}
}values ja valueOf
Kääntäjä luo kaksi staattista apumetodia:
values()palauttaa taulukon, joka sisältää kaikki vakiot.valueOf(String)etsii vakion nimen perusteella ja heittää poikkeuksen, jos vakiota ei löydy.
public class Main {
enum Status { ACTIVE, PAUSED, CLOSED }
public static void main(String[] args) {
System.out.println("count: " + Status.values().length);
Status s = Status.valueOf("PAUSED");
System.out.println("parsed: " + s);
}
}toString-metodin ylikirjoittaminen
Voitte ylikirjoittaa metodin toString() ja antaa vakioille käyttäjäystävällisemmät nimet säilyttäen samalla vakion nimen koodia varten.
public class Main {
enum Priority {
LOW, MEDIUM, HIGH;
@Override public String toString() {
return name().charAt(0) + name().substring(1).toLowerCase();
}
}
public static void main(String[] args) {
for (Priority p : Priority.values()) System.out.println(p);
}
}Enum-tyypit switch-lausekkeessa
Enum-tyypit toimivat siististi switch-lausekkeissa. Nykyaikaiset switch-lausekkeet tarkistavat kattavuuden, eikä niissä ole fall-through-ilmiötä.
public class Main {
enum Traffic { RED, YELLOW, GREEN }
static String action(Traffic t) {
return switch (t) {
case RED -> "Stop";
case YELLOW -> "Slow down";
case GREEN -> "Go";
};
}
public static void main(String[] args) {
System.out.println(action(Traffic.GREEN));
}
}Staattiset hakukartat
Yleinen toimintamalli on staattinen kartta, joka palauttaa kentän arvosta vastaavan vakion ja joka luodaan kerran staattisessa alustajassa.
import java.util.HashMap;
import java.util.Map;
public class Main {
enum Op {
PLUS("+"), MINUS("-");
private final String symbol;
Op(String symbol) { this.symbol = symbol; }
private static final Map<String, Op> BY_SYMBOL = new HashMap<>();
static { for (Op o : values()) BY_SYMBOL.put(o.symbol, o); }
static Op fromSymbol(String s) { return BY_SYMBOL.get(s); }
}
public static void main(String[] args) {
System.out.println(Op.fromSymbol("-"));
}
}Enum-tyypit toteuttavat rajapintoja
Enum-tyyppi voi toteuttaa rajapinnan, jolloin vakiot voidaan liittää yleiskäyttöiseen koodiin.
public class Main {
interface Describable { String describe(); }
enum Animal implements Describable {
DOG, CAT;
public String describe() { return "A " + name().toLowerCase(); }
}
public static void main(String[] args) {
Describable d = Animal.DOG;
System.out.println(d.describe());
}
}Pikatesti
Testatkaa ymmärrystänne enum-tyyppien kentistä.
Kertaus
Opitte, että enum-tyypit ovat täysiveroisia luokkia:
- Vakiot voivat sisältää kenttiä, jotka asetetaan yksityisessä konstruktorissa.
- Enum-tyypeillä voi olla instanssimetodeja, ja ne voivat ylikirjoittaa metodin
toString(). - Metodit
values()javalueOf()luodaan automaattisesti. - Enum-tyypit voivat toteuttaa rajapintoja, ja kenttiä kannattaa suosia metodin
ordinal()sijaan.
Seuraavaksi käsitellään vakiokohtaista toimintaa abstraktien metodien avulla.
public class Main {
enum Greeting { HELLO; String text() { return "Hi"; } }
public static void main(String[] args) {
System.out.println("Enum fields recap: " + Greeting.HELLO.text());
}
}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 ”Enumit kenttien ja metodien kanssa” ilmainen?
Kyllä – oppitunnin ”Enumit kenttien ja metodien kanssa” 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 ”Enumit kenttien ja metodien kanssa”?
Lisää enum-tyypeille toimintaa. 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 ”Enumit kenttien ja metodien kanssa”-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
- Enumit kenttien ja metodien kanssa
- Abstraktit metodit enumeissa
- EnumSet
- EnumMap