switch exhaustif sur un type scellé
Complétude vérifiée à la compilation
switch exhaustif sur un type scellé est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Sélection exhaustive
Lorsque vous utilisez switch sur un type scellé, le compilateur connaît tous les sous-types autorisés. Si votre sélection les traite tous, elle est exhaustive et vous n'avez pas besoin d'une branche par défaut.
Sélection avec motif de type
Les expressions de sélection peuvent vérifier le type réel d'une valeur scellée à l'aide de motifs de type.
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)));
}
}Aucune branche par défaut nécessaire
Comme Circle et Square sont les seuls sous-types autorisés, le compilateur accepte la sélection comme complète. Ajouter un default serait redondant.
Exhaustivité à la compilation
Si vous ajoutez plus tard un nouveau sous-type autorisé et oubliez de le traiter, toute sélection exhaustive échoue à la compilation. Cela transforme toute une catégorie d'erreurs d'exécution en erreurs de compilation.
Calculer un Result
Les expressions de sélection exhaustives sont idéales pour réduire une valeur à un résultat tel que area.
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)));
}
}Instructions de sélection et expressions
L'exhaustivité s'applique aux expressions de sélection (celles qui produisent une valeur) ainsi qu'aux instructions de sélection qui utilisent la forme avec flèche sur un type scellé. Le compilateur impose une couverture complète.
Gérer les valeurs nulles
Par défaut, une sélection sur une référence lève NullPointerException si la valeur est nulle. Vous pouvez ajouter une étiquette case null pour gérer ce cas explicitement.
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)));
}
}Les gardes ne compromettent pas l'exhaustivité
Vous pouvez ajouter des gardes when pour affiner les cas, mais un cas avec garde ne suffit pas à lui seul à couvrir un type. Vous avez toujours besoin d'un cas sans garde pour chaque sous-type afin de rester exhaustif.
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)));
}
}Effectuer une sélection sur une classe scellée
La même exhaustivité s'applique aux classes scellées, et pas seulement aux interfaces.
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)));
}
}Pourquoi cette approche est puissante
Les sélections exhaustives associées aux types scellés produisent un code sûr et facile à faire évoluer. L'ensemble des cas est documenté en un seul endroit et le compilateur garantit que vous n'en oublierez aucun lorsque le modèle évolue.
Un exemple complet
Dans cet exemple, un type de résultat scellé est réduit à un message avec une couverture complète.
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")));
}
}Vérification rapide
Vérifiez votre compréhension des sélections exhaustives.
Récapitulatif
Vous avez appris à utiliser une sélection exhaustive sur des types scellés.
- Traiter tous les sous-types autorisés rend la sélection exhaustive, si bien qu'aucun
defaultn'est nécessaire. - L'oubli d'un nouveau sous-type devient une erreur de compilation.
case nullgère explicitement les valeurs nulles.- Les gardes affinent les cas, mais ne remplacent pas un cas sans garde.
Apprends Java avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 104
- Leçons
- 374
Questions Fréquemment Posées
La leçon « switch exhaustif sur un type scellé » est-elle gratuite ?
Oui — le texte complet de « switch exhaustif sur un type scellé » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « switch exhaustif sur un type scellé » ?
Complétude vérifiée à la compilation Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « switch exhaustif sur un type scellé » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Déclarer des types scellés
- Clause permits
- Types scellés avec des enregistrements
- switch exhaustif sur un type scellé