Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvOpEsSS 100 of 147 menu
◀ ▶

Sealed-типы в switch в Java

Если переменная имеет запечатанный тип и в switch перечислены все подтипы, ветка default не нужна. Компилятор считает выражение полным так же, как для enum:

sealed class Post permits DraftPost, PublishedPost { } final class DraftPost extends Post { private final String title; DraftPost(String title) { this.title = title; } String title() { return title; } } final class PublishedPost extends Post { private final String title; PublishedPost(String title) { this.title = title; } String title() { return title; } }

Разберем запись в switch и выведем подпись выбранного варианта:

static String label(Post post) { return switch (post) { case DraftPost d -> "draft: " + d.title(); case PublishedPost p -> "live: " + p.title(); }; } System.out.println(label(new PublishedPost("News")));

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

final class ArchivedPost extends Post { }

Разберем вариант записи в switch и выведем короткий код:

static String code(Post post) { return switch (post) { case DraftPost d -> "draft"; case ArchivedPost a -> "archive"; }; } System.out.println(code(new ArchivedPost()));

Выражение switch может возвращать значение. Для запечатанного типа с полным набором веток тип результата выводится автоматически:

sealed interface PostResult permits OkResult, FailResult { } record OkResult(int id) implements PostResult { } record FailResult(int code) implements PostResult { }

Разберем результат операции в switch и выведем число:

static int metric(PostResult result) { return switch (result) { case OkResult ok -> ok.id(); case FailResult fail -> fail.code(); }; } System.out.println(metric(new FailResult(404)));

Объявите sealed class Employee permits NamedEmployee, GuestEmployee: NamedEmployee с полем name, GuestEmployee без полей. Напишите метод describe(Employee e) через switch: для имени верните "named " и имя, для гостя - "guest". Выведите результат для new GuestEmployee().

Объявите sealed interface Role permits UserRole, AdminRole как пустые final классы. Дано:

Role role = new AdminRole();

С помощью switch запишите в level: UserRole - 1, AdminRole - 10. Выведите level.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить