Java Academy · Lección

Patrones en switch

Combine tipos sellados y patrones

Lección 4 de 413 pasos

Patrones en switch es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Patrones en switch

Switch ha evolucionado: de comprobar constantes a comprobar patrones. Combinado con tipos sealed y records, un switch puede seleccionar por tipo, desestructurar datos y garantizar que se contemplen todos los casos.

Patrones de tipo en switch

Cada case puede ser un patrón de tipo que vincule una variable tipada para esa rama.

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

Los tipos sealed no necesitan default

Cuando el selector es un tipo sealed y se cubren todos los subtipos permitidos, el switch es exhaustivo sin 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)));
    }
}

Patrones de record en los casos

Los casos pueden desestructurar records y exponer sus componentes directamente al cuerpo de la rama.

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

Guardas con when

Una cláusula when añade una guarda booleana a un caso. El caso solo coincide si el patrón encaja y la guarda es verdadera.

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

El orden importa con las guardas

Los casos con guardas se prueban de arriba abajo. Un caso con guarda más específico debe aparecer antes que un caso sin guarda más general; de lo contrario, el caso general lo capturaría.

Gestión de null

Añada case null para gestionar un selector null; de lo contrario, el switch lanza NullPointerException. Incluso puede combinarlo como 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"));
    }
}

Patrones anidados en switch

Los casos pueden anidar patrones de record para hacer coincidir estructuras profundas y aplicar guardas a valores internos en un solo lugar.

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

Sentencias y expresiones

El switch con patrones funciona tanto como expresión (que produce un valor con -> o yield) como sentencia. Las reglas de exhaustividad se aplican cuando el selector es sealed.

Sustitución del código Visitor

En conjunto, los tipos sealed y el switch con patrones sustituyen los patrones Visitor verbosos y las cadenas de instanceof por una selección concisa y comprobada por el compilador sobre un modelo cerrado.

Un intérprete completo

Un evaluador de expresiones que utiliza un modelo sealed y un switch con patrones.

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

Comprobación rápida

Compruebe su comprensión de los patrones en switch.

Recapitulación

Ha aprendido los patrones en switch.

  • Los casos pueden ser patrones de tipo y patrones de record, con desestructuración.
  • Los selectores sealed proporcionan switches exhaustivos sin default.
  • Las guardas when refinan los casos; el orden importa.
  • case null gestiona null de forma segura.
Gratis para empezar

Aprende Java con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
104
Lecciones
374

Preguntas frecuentes

¿La lección «Patrones en switch» es gratis?

Sí — el texto completo de «Patrones en switch» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrones en switch»?

Combine tipos sellados y patrones Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Patrones en switch»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Pattern Matching para instanceof
  2. Patrones de records
  3. Patrones de records anidados
  4. Patrones en switch
← Volver a Java Academy