Kattava switch suljetulla tyypillä
Kattavuus käännösaikana.
Kattava switch suljetulla tyypillä on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Kaikki tapaukset kattava switch
Kun käytätte switch-rakennetta sealed-tyypin kanssa, kääntäjä tuntee kaikki sallitut alityypit. Jos switch kattaa ne kaikki, se on kattava, eikä default-haaraa tarvita.
Tyyppihahmoa käyttävä switch
Switch-lausekkeet voivat sovittaa sealed-arvon ajonaikaisen tyypin tyyppihahmojen avulla.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case Circle c -> "circle r=" + c.radius();
case Square sq -> "square s=" + sq.side();
};
}
public static void main(String[] args) {
System.out.println(describe(new Circle(2)));
System.out.println(describe(new Square(3)));
}
}default-haaraa ei tarvita
Koska Circle ja Square ovat ainoat sallitut alityypit, kääntäjä hyväksyy switch-rakenteen täydellisenä. default-haaran lisääminen olisi tarpeetonta.
Kattavuus käännösaikana
Jos lisäätte myöhemmin uuden sallitun alityypin ja unohdatte käsitellä sen, jokainen kattava switch ei käänny. Näin kokonainen ajonaikaisten virheiden luokka muuttuu käännösvirheiksi.
Tuloksen laskeminen
Kattavat switch-lausekkeet sopivat erinomaisesti arvon muuntamiseen tulokseksi, kuten pinta-alaksi.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Square sq -> sq.side() * sq.side();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Circle(1)));
System.out.printf("%.2f%n", area(new Square(2)));
}
}switch-lauseet ja -lausekkeet
Kattavuus koskee switch-lausekkeita (sellaisia, jotka tuottavat arvon) sekä sealed-tyypin kanssa nuolimuotoa käyttäviä switch-lauseita. Kääntäjä valvoo, että kaikki tapaukset on käsitelty.
null-arvon käsittely
Viitetyypin arvolla käytetty switch heittää oletusarvoisesti NullPointerException-poikkeuksen, jos arvo on null. Voitte käsitellä tilanteen eksplisiittisesti lisäämällä case null -tunnisteen.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case null -> "no shape";
case Circle c -> "circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(describe(null));
System.out.println(describe(new Circle(1)));
}
}when-ehdot eivät riko kattavuutta
Voitte lisätä when-ehtoja tapausten tarkentamiseksi, mutta pelkkä ehdollinen tapaus ei kata tyyppiä. Kattavuuden säilyttämiseksi tarvitsette edelleen jokaiselle alityypille ehdottoman tapauksen.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String size(Shape s) {
return switch (s) {
case Circle c when c.radius() > 10 -> "big circle";
case Circle c -> "small circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(size(new Circle(20)));
System.out.println(size(new Circle(2)));
}
}switch sealed-luokan kanssa
Sama kattavuus toimii myös sealed-luokissa, ei ainoastaan rajapinnoissa.
public class Main {
sealed static abstract class Token permits Word, Number {}
static final class Word extends Token { final String text; Word(String t){text=t;} }
static final class Number extends Token { final int value; Number(int v){value=v;} }
static String show(Token t) {
return switch (t) {
case Word w -> "word:" + w.text;
case Number n -> "num:" + n.value;
};
}
public static void main(String[] args) {
System.out.println(show(new Word("hi")));
System.out.println(show(new Number(7)));
}
}Miksi tämä on tehokasta
Kattava switch yhdessä sealed-tyyppien kanssa tuottaa turvallista ja helposti kehitettävää koodia. Tapausjoukko on dokumentoitu yhteen paikkaan, ja kääntäjä varmistaa, ettei mitään tapausta unohdeta mallia laajennettaessa.
Täydellinen esimerkki
Tässä sealed-tulos tyyppinä muunnetaan viestiksi siten, että kaikki tapaukset on käsitelty.
public class Main {
sealed interface Result permits Ok, Err {}
record Ok(int value) implements Result {}
record Err(String message) implements Result {}
static String render(Result r) {
return switch (r) {
case Ok ok -> "value = " + ok.value();
case Err err -> "error: " + err.message();
};
}
public static void main(String[] args) {
System.out.println(render(new Ok(10)));
System.out.println(render(new Err("bad input")));
}
}Pikatesti
Testatkaa, miten hyvin ymmärrätte kattavan switch-rakenteen.
Kertaus
Opitte käyttämään kattavaa switch-rakennetta sealed-tyyppien kanssa.
- Kun kaikki sallitut alityypit käsitellään, switch on kattava, joten
default-haaraa ei tarvita. - Uuden alityypin unohtamisesta tulee käännösvirhe.
case nullkäsittelee null-arvot eksplisiittisesti.- Ehdot tarkentavat tapauksia, mutta eivät korvaa ehdotonta tapausta.
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 ”Kattava switch suljetulla tyypillä” ilmainen?
Kyllä – oppitunnin ”Kattava switch suljetulla tyypillä” 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 ”Kattava switch suljetulla tyypillä”?
Kattavuus käännösaikana. 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 4/4.
Kuinka kauan ”Kattava switch suljetulla tyypillä”-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
- Suljettujen tyyppien määrittely
- permits-lauseke
- Suljetut tyypit ja tietueet
- Kattava switch suljetulla tyypillä