0Pricing
Java Academy · Урок

Шаблоны в switch

Сочетайте запечатанные типы и шаблоны

«Шаблоны в switch» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Шаблоны в операторе выбора

Оператор выбора прошёл путь от сопоставления констант к сопоставлению шаблонов. В сочетании с типами с ограниченной иерархией и записями он может выбирать действие по типу, деструктурировать данные и гарантировать полноту обработки.

Шаблоны типов в операторе выбора

Каждая ветвь может содержать шаблон типа, связывающий типизированную переменную для этой ветви.

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

Типам с ограниченной иерархией не нужен вариант по умолчанию

Если селектор имеет тип с ограниченной иерархией и Вы охватили все разрешённые подтипы, оператор выбора является исчерпывающим и не требует 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)));
    }
}

Шаблоны записей в ветвях

Ветви могут деструктурировать записи, предоставляя их компоненты непосредственно в теле ветви.

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

Условия для ветвей

Условие when добавляет логическую проверку к ветви. Ветвь срабатывает только тогда, когда шаблон подходит и условие истинно.

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

Порядок ветвей с условиями важен

Ветви с условиями проверяются сверху вниз. Более конкретная ветвь с условием должна находиться перед более общей ветвью без условия, иначе общая ветвь перехватит соответствующее значение.

Обработка значения null

Добавьте case null, чтобы обработать селектор со значением null; в противном случае оператор выбора выбросит NullPointerException. Можно даже объединить этот вариант с вариантом по умолчанию: 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"));
    }
}

Вложенные шаблоны в операторе выбора

Ветви могут содержать вложенные шаблоны записей, чтобы сопоставлять глубокие структуры и проверять внутренние значения в одном месте.

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

Инструкции и выражения

Оператор выбора с шаблонами работает и как выражение (возвращая значение с помощью -> или yield), и как инструкция. Для запечатанных селекторов действуют правила полноты обработки.

Замена кода обходчика

Вместе типы с ограниченной иерархией и оператор выбора с шаблонами заменяют громоздкие шаблоны обходчиков и длинные цепочки проверок типов компактным выбором действий по закрытой модели, который проверяется компилятором.

Полный интерпретатор

Вычислитель выражений, использующий модель с ограниченной иерархией и оператор выбора с шаблонами.

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

Быстрая проверка

Проверьте, насколько хорошо Вы поняли шаблоны в операторе выбора.

Итоги

Вы изучили шаблоны в операторе выбора.

  • Ветви могут содержать шаблоны типов и шаблоны записей с деструктуризацией.
  • Селекторы с ограниченной иерархией позволяют создавать исчерпывающие операторы выбора без default.
  • Условия when уточняют ветви; порядок имеет значение.
  • case null безопасно обрабатывает значение null.

Часто задаваемые вопросы

Урок «Шаблоны в switch» бесплатный?

Да — полный текст урока «Шаблоны в switch» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблоны в switch»?

Сочетайте запечатанные типы и шаблоны Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Шаблоны в switch»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сопоставление с шаблоном для instanceof
  2. Шаблоны record
  3. Вложенные шаблоны record
  4. Шаблоны в switch
← Назад к Java Academy