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.