Pattern in switch
Combinare tipi sealed e pattern
Pattern in switch è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Pattern in switch
Switch è passato dalla verifica di costanti alla verifica di pattern. Insieme ai tipi sealed e ai record, uno switch può eseguire il dispatch in base al tipo, destrutturare i dati e garantire la completezza dei casi.
Pattern di tipo in switch
Ogni case può essere un pattern di tipo, che associa una variabile tipizzata per quel ramo.
public class Main {
static String kind(Object o) {
return switch (o) {
case Integer i -> "int " + i;
case String s -> "string " + s;
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(kind(42));
System.out.println(kind("hi"));
System.out.println(kind(3.14));
}
}I tipi sealed non richiedono default
Quando il selettore è un tipo sealed e sono coperti tutti i sottotipi consentiti, lo switch è esaustivo senza un default.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.r() * c.r();
case Square sq -> sq.s() * sq.s();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Square(3)));
}
}Pattern di record nei case
I case possono destrutturare i record, rendendo i componenti direttamente disponibili nel corpo del ramo.
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(double w, double h) -> w * h;
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Rectangle(2, 5)));
}
}Guard con when
Una clausola when aggiunge una guard booleana a un case. Il case corrisponde solo se il pattern è adatto e la guard restituisce true.
public class Main {
static String size(Object o) {
return switch (o) {
case Integer i when i < 0 -> "negative";
case Integer i when i == 0 -> "zero";
case Integer i -> "positive";
default -> "not an int";
};
}
public static void main(String[] args) {
System.out.println(size(-5));
System.out.println(size(0));
System.out.println(size(7));
}
}Con le guard l'ordine è importante
I case con guard vengono valutati dall'alto verso il basso. Un case con guard più specifico deve comparire prima di un case non protetto più ampio, altrimenti quest'ultimo lo assorbirebbe.
Gestire null
Aggiunga case null per gestire un selettore null; in caso contrario lo switch genera NullPointerException. Può anche combinarlo come case null, default.
public class Main {
static String label(String s) {
return switch (s) {
case null -> "missing";
case "yes" -> "affirmative";
default -> "other: " + s;
};
}
public static void main(String[] args) {
System.out.println(label(null));
System.out.println(label("yes"));
System.out.println(label("maybe"));
}
}Pattern annidati in switch
I case possono annidare pattern di record per verificare strutture profonde e applicare guard ai valori interni in un unico punto.
public class Main {
record Point(int x, int y) {}
record Line(Point a, Point b) {}
static String describe(Object o) {
return switch (o) {
case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
case Line(Point a, Point b) -> "line";
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
}
}Istruzioni ed espressioni
Lo switch con pattern funziona sia come espressione (che produce un valore con -> o yield) sia come istruzione. Le regole di esaustività si applicano quando il selettore è sealed.
Sostituire il codice Visitor
Insieme, i tipi sealed e lo switch con pattern sostituiscono i verbosi pattern Visitor e le catene di instanceof con un dispatch conciso, verificato dal compilatore, su un modello chiuso.
Un interprete completo
Un valutatore di espressioni che usa un modello sealed e uno switch con pattern.
public class Main {
sealed interface Expr permits Num, Add, Mul {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
record Mul(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
return switch (e) {
case Num(int v) -> v;
case Add(Expr l, Expr r) -> eval(l) + eval(r);
case Mul(Expr l, Expr r) -> eval(l) * eval(r);
};
}
public static void main(String[] args) {
Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
System.out.println(eval(e));
}
}Verifica rapida
Verifichi la Sua comprensione dei pattern in switch.
Riepilogo
Ha imparato a usare i pattern in switch.
- I case possono essere pattern di tipo e pattern di record, con destrutturazione.
- I selettori sealed producono switch esaustivi senza
default. - Le guard
whenrendono i case più specifici; l'ordine è importante. case nullgestisce null in sicurezza.
Domande Frequenti
La lezione «Pattern in switch» è gratuita?
Sì — il testo completo di «Pattern in switch» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern in switch»?
Combinare tipi sealed e pattern Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Pattern in switch»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.