Объявление sealed class в Java
Класс с модификатором sealed задаёт родительский тип
с заранее известным полным набором подтипов. Наследование
оформляют как у обычного класса, но все потомки должны
быть final, sealed или non-sealed;
снаружи разрешённого списка новый наследник добавить
нельзя:
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;
}
}
Создадим DraftPost и проверим оператор instanceof:
Post post = new DraftPost("Notes");
System.out.println(post instanceof DraftPost);
Вариант без полей оформляют финальным классом без дополнительных данных. Так отмечают единственное состояние вроде архива или пустого результата:
final class ArchivedPost extends Post {
}
Создадим ArchivedPost и выведем короткое имя его класса:
Post post = new ArchivedPost();
System.out.println(post.getClass().getSimpleName());
Переменная запечатанного типа может хранить любой из
объявленных подтипов. Проверка типа через instanceof
и разбор по вариантам удобно делаются в switch -
компилятор видит весь список наследников:
public class Main {
static String kind(Post post) {
if (post instanceof DraftPost) {
return "draft";
}
return "published";
}
public static void main(String[] args) {
System.out.println(kind(new PublishedPost("News")));
}
}
Объявите sealed class Employee с вариантами
Intern и Staff как final классы
без полей.
Сохраните new Staff() в переменную Employee
и выведите true, если это Staff.
Объявите sealed class Employee:
NamedEmployee с полем name,
GuestEmployee без полей.
Создайте new NamedEmployee("Ann"),
сохраните в employee и выведите имя.