Java Academy · Leçon

switch exhaustif sur un type scellé

Complétude vérifiée à la compilation

Leçon 4 sur 413 étapes

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 default n'est nécessaire.
  • L'oubli d'un nouveau sous-type devient une erreur de compilation.
  • case null gère explicitement les valeurs nulles.
  • Les gardes affinent les cas, mais ne remplacent pas un cas sans garde.
Gratuit pour commencer

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

  1. Déclarer des types scellés
  2. Clause permits
  3. Types scellés avec des enregistrements
  4. switch exhaustif sur un type scellé
← Retour à Java Academy