0Pricing
Java Academy · Leçon

Motifs dans switch

Combinez types scellés et motifs

Motifs dans switch 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.

Les motifs dans une instruction de sélection

Les instructions de sélection sont passées de la comparaison de constantes à celle de motifs. Associée aux types scellés et aux enregistrements, une instruction de sélection peut répartir le traitement selon le type, déstructurer les données et garantir l'exhaustivité.

Motifs de type dans une instruction de sélection

Chaque branche peut être un motif de type, qui lie une variable typée pour cette branche.

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));
    }
}

Les types scellés ne nécessitent aucun default

Lorsque le sélecteur est un type scellé et que vous couvrez tous les sous-types autorisés, l'instruction de sélection est exhaustive sans 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)));
    }
}

Motifs d'enregistrement dans les branches

Les branches peuvent déstructurer des enregistrements et exposer directement leurs composants dans le corps de la branche.

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)));
    }
}

Gardes avec when

Une clause when ajoute une garde booléenne à une branche. La branche ne correspond que si le motif convient et que la garde est vraie.

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));
    }
}

L'ordre compte avec les gardes

Les branches gardées sont essayées de haut en bas. Une branche gardée plus précise doit apparaître avant une branche non gardée plus générale, sinon cette dernière l'absorberait.

Gérer les valeurs nulles

Ajoutez case null pour traiter un sélecteur de valeur nulle ; sinon l'instruction de sélection lève une NullPointerException. Vous pouvez même le combiner sous la forme 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"));
    }
}

Motifs imbriqués dans une instruction de sélection

Les branches peuvent imbriquer des motifs d'enregistrement pour mettre en correspondance des structures profondes et appliquer au même endroit une garde sur les valeurs internes.

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))));
    }
}

Instructions et expressions

La sélection avec motifs fonctionne à la fois comme une expression (qui produit une valeur avec -> ou yield) et comme une instruction. Les règles d'exhaustivité s'appliquent lorsque le sélecteur est scellé.

Remplacer le code de visiteur

Ensemble, les types scellés et la sélection avec motifs remplacent les schémas de visiteur verbeux et les enchaînements de tests de type par une répartition concise et vérifiée par le compilateur sur un modèle fermé.

Un interpréteur complet

Un évaluateur d'expressions utilisant un modèle scellé et une sélection avec motifs.

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));
    }
}

Vérification rapide

Testez votre compréhension des motifs dans les instructions de sélection.

Récapitulatif

Vous avez appris à utiliser les motifs dans les instructions de sélection.

  • Les branches peuvent être des motifs de type ou d'enregistrement, avec déstructuration.
  • Les sélecteurs scellés donnent des instructions de sélection exhaustives sans default.
  • Les gardes when affinent les branches ; l'ordre compte.
  • case null permet de traiter les valeurs nulles en toute sécurité.

Questions Fréquemment Posées

La leçon « Motifs dans switch » est-elle gratuite ?

Oui — le texte complet de « Motifs dans switch » 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 « Motifs dans switch » ?

Combinez types scellés et motifs 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 « Motifs dans switch » ?

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. Correspondance de motifs avec instanceof
  2. Motifs d’enregistrements
  3. Motifs d’enregistrements imbriqués
  4. Motifs dans switch
← Retour à Java Academy